I have one idea, I'd like opinions on it please. Lack of experience prevents me from knowing if I am just heading for another set of problems.

How about adding a PIC 16F628 to poll the MCP23016 and use hardware USART to send a word whenever data from the I/O Expander changes?

I checked the datasheet and the 16F628 can go up to 5000 KBAUD at 20MHz while in Synchronous mode. Is that fast enough without the USB service dropping?

Robert