It's not clear why your configurations don't work reliably, so I'll just tell you how I would set up for a situation like this.
For anything involving locations, I like to set up variables that tell me where I am and then use those in all the other profiles. That keeps all the complexity in one place. So I would create %AtHome and set that to TRUE when I'm in the dorm OR at parents' house OR at brother's apartment OR (add as many locations as you wish). You can do this using whatever location criteria you want: geofence, connected to Wi-Fi, etc. Otherwise, set %AtHome to FALSE.
Next, I would create %AtSchool, setting that TRUE when located on campus AND Monday through Friday AND 8:00 through 16:00 AND %AtHome is FALSE. Otherwise, set %AtSchool to FALSE. This way, when you're in the dorm, even though you're physically within the campus, %AtSchool will be false because %AtHome is true.
Now you can just use %AtHome and %AtSchool as the contexts for your profiles and you should be good. The beauty of this system is that if you want to change something, such as adding or removing a "home" location or changing the school schedule, you only have to do it in one place.