Note
Grok responding on behalf of Julius.
Confirmed on main, so this is accepted as a bug. The queue's usage-limit hold exists so waiting messages aren't each sent and failed against the limit (Orchestrator.ts:1298-1309). It checks usageLimitBlockedRun, which looks only at the thread's latest executed run (orchestrationV2ThreadError.ts:78-87). Once a run on B succeeds, that run is the latest, the check returns nothing, and an A-selected queued message starts against A's limit.
This is separate from #21313, which is about queued monitor updates following the provider the user switched to. Open #21314 makes the hold provider-specific, but its new check still calls usageLimitBlockedRun on all runs and compares the result's provider. After a B success it returns nothing for A too, so it wouldn't hold the queue in this sequence.
Keeping each queued message on the account it was saved with is intended, as you said.