In bash one can escape arguments that contain whitespace.
foo \"a string\"
This also works for arguments to a command or function:
You can use the arrays just as you suggest, with a small detail changed. The line calling foo should read
foo "${args[@]}"