Fixed: I was using CY_DMA_TD_AUTO_EXEC_NEXT, when I shouldn't have been.
So it seems that AUTO_EXEC_NEXT does not mean 'I have multiple TDs in a chain which need to seamlessly flow into each other'. What it means is 'Automatically trigger a DMA transfer for the next TD when this one completes', i.e. if you want continuous memory transfers as fast as possible. As my transfers were all externally triggered via the drq line, this was causing really weird stuff to happen.