I may be mistaken, but a global variable like the one you describe would not always be accurate, since it has to deal with asyncrounous speech and multiple TTS instances as well, so i think it would not be always clear to VA when there's still a speech pending somewhere.
On the other hand, if you combine the "Wait until speech has completed before continuing the command" with a user variable manually set in your profile, you should be able to catch all the possible scenarios
To avoid redundand code in the profile, you can isolate the speech feedback in a single command, while the rest of the profile, instead of calling the standard TTS action, could refer to that... for example:
Define an inactive command command (sync_speech) like this
Start Loop While [PendingSpeech] Has Been Set
Pause 0,5 seconds
End Loop
Set Boolean [PendingSpeech] to True
Say, '{TXT:LastSpeech}' (and wait until it completes)
Set Boolean [PendingSpeech] to [Not Set]
and every time you wanna say something in all the other commands, use
Set Text [LastSpeech] to 'This is a test'
Execute command, '(sync_speech)'
Edit: also, since I've realized that your software uses a custom made plugin, not just profiles, you can achieve even greater control by integrating the speech part in the plugin itself... basic TTS capabilities in .NET could be as easy as this
using System.Speech.Synthesis;
SpeechSynthesizer synth = new SpeechSynthesizer();
synth.Speak("Hello world from the default voice.");
and you can then add any complex condition check that you'll like... again, in the profile all you need to do is just set a text variable and call a pluging function instead of the standard TTS action