What about priority inversion? If a high QoS thread waits on a low QoS one? It seems like it would be a bigger issue here as the low QoS threads are only ever run on half the cores.
Grand Central Dispatch (the OS-level framework that handles these QoS classes) elevates the priority of a queue if there is high priority work waiting on low priority work to finish.