I think the issue was in one particular macro. I wrote some test macros with some motion commands and they all executed fine with no timing issues. I couldn't pinpoint the issue with the macro because it worked in the editor but failed when run. When it failed it just went to the next line which made me think it was just blowing past the mcCntlGcodeExecuteWait(). I re-wrote the macro and it worked.
I did figure out that using a combination of mcCntlMdiExecute() and mcCntlGcodeExecuteWait() can cause strange behaviour. I've seen a total crash and I've seen where the code seems to function, but it doesn't update the screen (DRO's and toolpath display) while it's doing it. For instance using mcCntlGcodeExecuteWait() in the macro, then calling the macro from a button using mcCntlGcodeExecuteWait(inst, 'M3000') caused a crash. Calling the same macro using mcCntlMdiExecute(inst, 'M3000') works if there is no other code or if this is the last line of code, otherwise it blows past the mcCntlMdiExecute() and on to the next line.
If I take the code out of the macro, using mcCntlGcodeExecuteWait(), and drop it in a button script, it seems to work, but the screen doesn't update while the code is running. It updates after the button script is done. It's just a matter of figuring out what works with what.