Subroutines don't automatically execute if you use your return
statements properly.
As a rule, have a return
at the end of each subroutine or multi-line hotkey (Single-line hotkeys don't need that). (A function's execution terminates at the closing brace, so you don't need a return, unless of course you want to return a value, or end termination at some other point in the function.)
Also, ensure you define any subroutine outside the auto-execute section of the script, to prevent it from automatically executing when the script starts.
More about the "auto-execute" section from AHK docs:
The Top of the Script (the Auto-execute Section) After the script has
been loaded, it begins executing at the top line, continuing until a
Return, Exit, hotkey/hotstring label, or the physical end of the
script is encountered (whichever comes first). This top portion of the
script is referred to as the auto-execute section.
A script that is not persistent and that lacks hotkeys, hotstrings,
OnMessage, and GUI will terminate after the auto-execute section has
completed. Otherwise, it will stay running in an idle state,
responding to events such as hotkeys, hotstrings, GUI events, custom
menu items, and timers.
EDIT:
Unfortunately, you still cannot bind direction function calls to menus, because that's not supported.
But you could call your functions from within the corresponding subroutines (now that you know how to keep them from running automatically). By exposing some state globally you can eliminate the need to pass arguments to your functions. However, if you don't want to do that, you can simply create variables initialized to whatever values you want to pass to the "bound" function at that point, and then using them to make the equivalent of the the "bound" function call that you wanted to make. For example:
subroutine:
arg1 = <some expression>
arg2 = <some expression>
MyFunction(arg1, arg1)
return
MyFunction(a, b)
....
}