The MCP23018 can handle 3.4 MHz I2C bus, but even so with the start/stop bits and sending all the commands communication easily adds up to maybe 60 bits total, which takes some 17µs. With the interrupts to guide you, you still have to read three chips to get to the triggered pin, and that's 54 µs before you start doing anything with that data. That sounds very possible.
However if there's a good chance of multiple inputs at the same time, you have to scan all of them: 16 scans of 17 µs each makes 272 µs. Still ample time left to do something useful and do it all over again within 1 ms.
This assumes you run your I2C bus at 3.4 MHz! And there we hit another problem: on Arduino's (with their 16 MHz ATmega) it seems the bus speed is limited to 400 kHz, which makes it too slow. Your interrupt assisted scan would take 500 µs, the complete scan about 2.5 ms. So with the interrupts it would fall within the 1 ms per scan requirement and allow you some time to do other things, like doing something useful with the data and writing some outputs or so.
On the 80 MHz ESP8266 the I2C is also limited to 400 kHz (it's all done in software), but at least no need for an I2C multiplexer which may add additional delays in communication.
The SPI bus should be faster than this, allowing for faster communications, and may be an option to speed up the process and be able to read your inputs faster.