Thank you both for your responses.
@dc42 this has helped me out enormously. I think you're right on the money with:

@dc42 said in Reading Multiplexed Analogue Inputs:

a G1 command followed by a M42 command followed by a command to read an input, the command to read the input is likely to take place before the M42 command.

I went back and tested a few things and found the above to be true. The solution I came up with was to set the mux select pins with M42 in daemon.g and then idle in a while loop until they had changed according to the object model:

while((state.gpOut[10].pwm!=var.muxInputs[0])&&(state.gpOut[11].pwm!=var.muxInputs[1])&&(state.gpOut[12].pwm!=var.muxInputs[2])&&(state.gpOut[13].pwm!=var.muxInputs[1])) continue G4 P250 set global.muxValues[iterations] = sensors.analog[2].lastReading

I found that a 250ms delay was still required to get consistent results, but this is much better than the 600ms I had before.
I also tried using an M400 after setting the mux pins, but unsurprisingly, this caused to print to stutter as the move queue emptied and refilled again.

Thanks again for all your help. Keep up the good work!