Following up on this: the M18 does work, of course. I had my Slicer calling G29 directly, not bed.g, so M18 never got run.
On the subject of the interference, I ordered some ribbon cable and JST connectors and crimped a new cable for the probe. I also made some stand-offs to separate the stepper cables from the others in the cable harness. (photo below.) The probe does not do the instantaneous false triggers it was occasionally doing before. Unfortunately, its still not performing well. Strangely, the number of repeat probe events does change that much between S0.01 and S0.03, so I feel certain it is some kind of pick-up rather than the noise floor of the system.
If I separate the probe wire from the harness completely and suspend it off to the side, I can get a really good mesh probe. For now I'm just reloading the saved mesh from file and only probing the center before each print.
I'm wondering whether this is just shoddy performance of the Trianglelab clone BLTouch, I haven't had the same problem with the genuine BLTouch on my other printer. I'm thinking of getting the differential IR probe instead, and giving that a try.