Watch the dirty cache data when this is happening, if you want to know for sure. Put a couple "sync;sync;sync"'s &&'ed on that cat, if you want to watch stimulating behaviour..
(More often than not, its the device. Linux is dealing with it fine.)
There is a long standing (CFQ-related) kernel issue causing system lockups in high I/O situations:
With blk-mq + nvme and later lightnvm that whole IO-scheduler mess will hopefully go away over the course of the next couple years (at least for personal computers).
Edit: never mind, Johnp_'s comment and bugzilla link is highly interesting.
It feels like there was too many cooks involved this time round, trying to make the USB spec go in multiple directions at once.
Where before port and speeds were joined in one spec, now you have no less than 3 specs that can be mixed as the device OEM sees fit.
First is the 3.1 data spec, that can work on both A and C plugs.
then you have the C plug spec, that as you point out do not require 3.1 data.
Then there is the Power Delivery spec, that is all about turning USB into a generic power delivery cable. And that again can be used with both A and C plugs, and with any and all data speeds.