Hi,
I must admit I haven't read all of your posting, but I have my doubts that you really found a bug in the Wire-lib, since this code hasn't been updated for years and is in use by thousands of projects.
I would look for problems on the slave-side rather than on the Arduino side.
The fastes easiest way to find out what is happening would be to hook up a logic-analyzer to the signals and see if the communication follows the (well-defined) I²C-protocol.
But since this nothing to be found in everybodys household ....
The only situation where the (arduino-) master must wait endlessly for a slave device, is when the slave pull the SCL-Line low during clock-stretching. I²C - Wikipedia
If the compass module never releases that line, this is a software/hardware-bug on the slave side.
That a powered down compass module also seems to stall the complete communication also sounds like a hardware bug on the compass side. I don't know if the I²C-Protocol says anything about this situation, but I never had a slave device the acted that way.
And the I²C-Bus supports up to 127 devices. I does not make any sense that a failure in one slave device should bring the whole bus down
Eberhard