While I totally agree with your post (especially the point that a course where you implement your own OS for real hardware is great), I would like to add that USB is a massive foundation/abstraction layer. Once you got USB going for HID, you are much closer to USB for storage, USB for networking, etc. So it certainly is troublesome from an educational perspective but the complexity is where it belongs.
Implementing the minimal “bootstrap” HID interface can be done without most of the abstraction layers. It’s effectively hard-wired and barely parsing of any descriptors or anything.