I finally discovered what the problem was.
My code was sending an acknowledge to the accelerometer after every read, including the last (7th) read. I should have sent a Not Acknowledge (i.e. nothing) after the last read. I have no idea why it exhibited itself in this weird x-axis behaviour - but it definitely fixed it (and removing the line reverts back to the broken behaviour.).
The missing line was
IICC_TXAK = 1;
Which suppresses the acknowledge bit on the next read.
Thanks for taking the time to look into it and for the advice.
Pete
See code below:
// Read FMode Register followed by the X MSB, XLSB, YMSB, YLSB, ZMSB and ZLSB registers (7 in total)
IICC_TX=0;
IICC_TXAK=0;
IICD; // Generate clock pulses
delay(6);
accFMode = iic_ReadNextByteOffBus();
accXmsb = iic_ReadNextByteOffBus(); // Read X Most Significant Byte (MSB)
accXlsb = iic_ReadNextByteOffBus(); // Read X Least Significant Byte (LSB)
accYmsb = iic_ReadNextByteOffBus(); // Read Y MSB Byte
accYlsb = iic_ReadNextByteOffBus(); // Read Y LSB Byte
accZmsb = iic_ReadNextByteOffBus(); // Read Z MSB Byte
IICC_TXAK=1; // Don't send an acknowledge bit so that the accelerometer knows this is the last byte
accZlsb = iic_ReadNextByteOffBus(); // Read Z LSB Byte