ok,
i have tested this on my machine, where i can do a real toolchange.
and you are absolute right, the macro is not waiting for the M6 to be finished.
so i made a Little Workaround.
code for the M6 call:
SetUserLed(1400,0)
Code "M6 T8"
While GetUserLed(1400) = 0
Sleep(50)
Wend
and then the last line in M6 is:
SetUserLed(1400,1)
so the calling macro has to wait until M6 set's UserLed(1400).
you have also to find an other mechanism to know that the run of M6 was faulty,
to cancel the main macro as well.
the trick with the UserLed is "dirty".
i would get the M6 code in a function inside your main macro, and create a returnvalue to
have the control in main macro by a fault.