Agreed, but to be fair, according to peter, the root issue here seems to lie in the code handling USB, which, if it does actually do what peter says, does not play well with an RTOS. Which in itself is not so great.
Any task/ISR that can become non-preemptable by a higher-priority task/ISR leads to prioriy inversion, which is the thing you normally want to avoid. If the max time during which this can happen is below the max acceptable 'latency' for all other tasks, that works, even though you're always at the mercy of a future change that may make this requirement not met anymore.
Now surely there would be improvements to be made in how the various tasks are designed, but not sure that would solve this particular issue here (that may solve a number of potential others though.)
Fixing the USB stuff would be best, but if it can't be done, first thing to check would be to see if there's at least a way of configuring it to avoid priority issues. Was it written to play well with FreeRTOS to begin with?
Also, as I mentioned in an earlier post, I personally avoid async communication as much as I can if it's not possible to implement some kind of hardware handshaking and only resort to async comm without handshaking if I really have no other choice and I can ensure that the CPU which will handle reception will be able to handle it 100% of the time. Alternatively, of course, if you can't use hardware handshaking, you can work around that by implementing a master/slave protocol which doesn't allow any of the slave devices to transmit data unless they have been instructed to (by a command from the master), and make sure that the master is 100% available to handle the reply within the defined time-out (the rest of the time, it could even ignore whatever comes in.) Just my 2 cents, of course if all of that is not designed in from the start, it's rarely possible to add that in afterwards without making major system changes.