Here is an idea:
# Helper function to define expandable functions
exec-or-expand() { if [[ -n $EXPAND ]]; then print -z "$@"; else "$@"; fi; }
# Command to force the expansion of a function defined with exec-or-expand
expand() { EXPAND=1 "$@"; }
# Example of expandable function
f1() { exec-or-expand echo blahblah -o1 -o2 $1 -o3 $2 $3 }
% f1 a b c
blahblah -o1 -o2 a -o3 b c
% expand f1 a b c
% echo blahblah -o1 -o2 a -o3 b c
blahblah -o1 -o2 a -o3 b c
Caveat: probably won't do what's desired if redirections are used.
Philippe