Thanks @Lesley. This seems interesting but I suspect it isn't what I need. I think my issue relates to getting return/reply traffic back out of the interface it arrived at. My interpretation of that SK is for packets initiated from the LAN outbound. In my case packets are initiated from the Internet inbound, which arrive fine, but the reply traffic leaves from a different interface.
So SYN comes into ISP-A on eth0, but the SYN-ACK leaves via eth1 (the new ISP line, and new Default Gateway). How do I get the SYN-ACK to return via eth0 instead, to avoid asymmetric routing?
I'm assuming that's my issue here because once the default gateway is set to ISP-B, none of the NAT's on ISP-A work any more. If I add a static route to my Internet test machine via ISP-A then I can access everything normally again. So it seems stateful reply traffic is following the routing table and breaking the connections. While ISP-B is default, I simply need a way to still be able to access NAT's on ISP-A.
Maybe if I hide NAT behind the ISP-A interface IP on the way in that would work? It's horribly messy, but worth a try.