slight update: It seems I was wrong in thinking Mach 'thought' it had moved. After more checking it knows it hasn't. Here's what happens:
DRO for Xpos says 5
My macro then executes a G01 X-5 in incremental mode. X should of course now be 0 but it's still 5 and there is definitely no movement. BUT the while isMoving() wend loop still goes through several hundred iterations. So it seems that the macro thread is sending the request to the Mach thread and Mach is taking some time to do something before sending the signal back to the macro that it's finished. It's just that whatever else Mach was doing during that time, it certainly wasn't executing the G01.
So, when we send off "code statement" requests to the Mach thread and for whatever reason it fails to honour the request, does anyone know if Mach sets an error condition and/or reason block that can be read by the macro thread?