I have resolved this, the trick is in the mode parameter I2CM_MasterReadBuf().
I was able to split the transfer into two consecutive calls:
for the first mode = I2C_MODE_NO_STOP,
for the second mode = I2C_MODE_RESTART.
However it's not clear how you could do more than two blocks in a transfer without a STOP, I tried consecutive intermediate blocks with each setting mode to:
I2C_MODE_REPEAT_START | I2C_MODE_NO_STOP /* this is really what you want to work */
The first of these puts a stop on the bus, the latter two end up at the CYASSERT() in the ISR
case I2CM_0_SM_MSTR_RD_ADDR: /* After address is sent, read data */
/* Address phase is not set for some reason: error */
/* Exit interrupt to take chance for timeout timer to handle this case */
/* Block execution flow: unexpected condition */
CYASSERT(0u != 0u);
#endif /* (I2CM_0_TIMEOUT_ENABLED) */
Fortunately < 512 bytes is enough for my application!