Thanks, Neil - as ever, asking the question helped me find the answer!

Quick answer is that upgrading to the older version has fixed the problem, as far as I can tell. I've done a few tests, including air cuts of a previous job, and all goes well. Anyway, well enough for me to find a bug or two in my code. If you save the fixed touchplate height in one macro, then it makes sense to use the same variable in the next macro. Fortunately, e-stop saved my bacon and another hole in the bed. I've tweaked the 1024 screen to replace a couple of things in the tool offset area with new buttons that execute my new macros; the first picks up the movable touchplate of the surface of the work in the usual way then goes off to find the relative height of the fixed touchplate and the second is used for subsequent tool changes by setting off the fixed touchplate. Nowt very original but it's quite satisfying to have done it, and I've learnt a fair bit about macros in Mach3 and the need for a short pause after certain operations, for example. All the code uses the native IP/M probing functions rather than G31. I've tested this with tool changes while running real gcode so it seems to work correctly with the M6 macros. Happy to share code if you're interested, on a strict YMMV basis!