Hello @jaredahern!
The short answer is that while constraint validation was relatively recently introduced it is skipped for constraint that reference excluded fields to be coherent with how unique together and unique for date validation has historically worked.
As for why form initiated model validation excludes all models fields not present in the form I believe that it is to account for the fact the some model fields values (that might be part of constraints) might be assigned after validation occurs and that (long ago) a decision was taken to allow this pattern to be used at the cost of requiring manual constraint validation when its the case.
There also the question of what exactly should be displayed to the user when their form submission results in a constraint violation involving fields values they cannot control (b in your case). In the face of this ambiguity the system was designed to perform validation only when it could be sure it had all the information at hand and forcing users of field shadowing and constraints to implement their own validation logic.
Now in your case this validation logic could take many forms but I believe that the most appropriate one would be to have your QuestionAdmin provide a form override to provide a clean method that calls Question._meta.constraints[0].validate directly.