@Red-Sand-Robot I see you've got a M561 in your bed.g file so all good there. Your probe points and leadscrew positions look sensible if your origin is in the middle of your bed. Doesn't really matter where the bed is in reality, as long as everything is correct to where the Duet thinks the origin is.

Other ideas, prepare for a brain fart...

If you run autotramming (G28) on it's own from console, does it run okay? Does it have issues with needing too much correction (S parameter in M671 which defaults to 1mm)? If you repeat it, do the results converge quickly?
If you then do a paper test at either end of the x-axis, does it show the same high-nozzle-issue at one end? this might show whether it is G28 or G29 related

Just to double check, the motor connected to your left leadscrew (at X -158) is on Driver 4 whilst the right one (at X 152) is on Driver 2? Been there, done that, got the bent leadscrew... 😛

On your heightmap, have you tried running a more detailed one to see what the bed surface actually looks like? Maybe also post a screenshot of a typical heightmap? I've had some weird results when probing a dimple in my bed from a few nozzle crashes.
You may get better results if you just do one detailed heightmap (e.g. 400 points) and keep reloading it with G29 S1? This is what I do on my coreXY (I only rerun if I disassemble parts) but it is pretty rigid...

Would definitely recommend rehoming Z after bed.g, though I think this will mainly cause an offset in the heightmap, not a tilt. I just call 'G28 Z' as the last line in bed.g

Edit: one final thought... Is there any play in your x-carriage bearings/rails? this might cause some error in your probe measurements depending on the travel direction?