Yes, of course, there doesn't exist a vfptts.exe. I chose the name so it alone already is suggesting to you that it is an EXE doing TTS programmed in VFP. Thanks for posting the code, that plus a bit of parameterization is all you need in a separate EXE and already you don't wait for the speak to finish.
All you would have needed to tell is that you make a call to something that is executing synchronously, i.e. like any VFP code execution will only continue when that call returns. It's the norm, but usually a single command or function doesn't take the time it takes to speak a text.
If you want to start something and still go on in your code with the rest of the application, RUN /N is one solution if that task can be done by a separate process.
Another way of doing something almost parallel is have a timer that you setup to execute in 1ms by Interval=1, for example, and in it's Timer event then stops itself, a run once timer.
When you initialize it, that's being done with it, and your code continues. When that timer runs, it first should disable itself and never re-enable a next timer event to happen. Well, a run-once timer. But I guess when you do the speak method of the sapi.spvoice in the timer event your normal code and events still become less responsive, as VFP isn't multithreaded, a timer event interrupts anything that runs and that only continues after the timer finishes. So it's still blocking. That's why a VFP timer also isn't actual multithreading.
But in another process that's even not needing a timer. What's unnatural about VFP is that RUN by default waits for the EXE you run to finish, RUN /N should be the default. If you use Windows API CreateProcess() waiting for that created process to finish needs an extra call to WaitForSingleObject, the object being that other process. So actually in multiple processes parallelism is the default and I don't see a more complex need in your case.
Chriss