Sabrent sells a four port USB 3.0 hub that has buttons on the top to control disconnect and reconnecting of that device. Not sure if Windows will go crazy but Linux does not.
Without doing a deep dive into your code, I would recommend you use the constexpr keyword on your variables that will never change during runtime. The keyword marks them as const for runtime but also tells the compiler that it can do more...
So I have done this before with a display, multiple MCP23S17s, and eight psram chips all on the same SPI bus (it was on an ATMEGA1284p but the idea still works). What you're describing is why there are beginTransaction and endTransaction...