Ok, had some time to try it out - the decode byte logic needs to be added, it generates better (correct?) results. I probably just missed that in my first tests - the values do increase, roughly speaking, but with the decoding the values change much more smoothly.
I get what looks like reliable values for joystick X/Y, and for accelerometer X/Y/Z. The two buttons are flakey, though.
Ah, wait... looks like the Nunchuk does clock-stretching, which isn't supported in the bit-banged PortI2C class. I get reliable readouts for everything by lowering the clock speed even further. Changing the second arg of PortI2C from PortI2C::KHZ100 to 15 seems to do the trick (i.e. around 60 KHz).
Hm, maybe I need to implement a second version of PortI2C which supports clock stretching. It's going to be more complex, and slower, though.