I glanced over the more important bits of your post.
What I had in mind was KWP2000 protocol, very similar to ISO9141, but different responses and commands resulting in similar issues.
The ~b is the 'invert' of the byte. Not the actual sent string
.
Cars that are ODBII in the US after 1996 aren't everywhere else (I note your location).
0x55 is the init sync byte, could it be that you are reading it and getting the same value twice?
When I was debugging another protocol, I set about doing it in a request reply manner and used the 'duino with my custom program in it to do the init and go so far as the init (writing out to SoftwareSerial every step of the way so I knew I wasn't reading the previous value of 'b" for example).