There is no way to just pass stuff around like function parameters as we know that can be any number of values with any result type. However, there is a feature called, 'command shared variables' (VA help doc, around page 161). What this does is allow a variable to be scoped only to a command and to every command that is called by that command (and as every command completes, every calling command all the way back up the tree).
Some examples:
So, lets say you have command A, which calls command B.
Command A sets a command-shared variable ~~myVar to 10 (note the ~~ before the name)
A calls B
B can read ~~myVar and says (with TTS) "The value is 10".
(This simulates passing a parameter, no return value).
Second example (using commands A and B again):
Command A sets a command-shared variable ~~myVar to 10
A calls B (which is flagged to wait until finished - important for this example).
B reads ~~myVar and multiplies it by 10.
B completes and then A reads ~~myVar and says (with TTS) "The value is 100"
(This simulates passing a parameter by ref).
One more example:
Lets say you have command A, which calls command B, which calls command C.
A calls B (which is flagged to wait until finished - important).
B sets command-shared integer variable ~~myVar to 10.
B calls C (which is flagged to wait until finished - important).
C can read ~~myVar and sets integer ~~myNewVar as ~~myVar times 10.
B can also read ~~myNewVar and multiplies it times 2.
A can also read ~~myNewVar and ~~myVar and multiplies them together and gets a result of 2000.
(This simulates passing a parameter, and getting a return value somehow o_O).
I guess I've made a complicated illustration. Sorry about that. I needed to show how the values are shared in the same lineage even though the value originates in a subcommand. Not a conventional way of doing things, but it is a way ;)
Hope some of that might help in some way.