When the beam hits a ship it calls ship_apply_local_damage (line 2788 of code/Weapon/Beam.cpp). If you check the parameters it passes, the beam passes a -1 to the function under shield quadrant.
In code/ShipHit/ShipHit.cpp on line 2284, the comment tells you that a -1 passed through in the shield quadrant parameter makes the hit ignore the shield. It also tells you that the ship_apply_local_damage function assumes that whoever called the function knows if the shield got hit or not.
So what we need to do is find the shield facing that is hit. Well, as _argv[-1] noted, the beam weapon passes the MC_CHECK_MODEL rather than the MC_CHECK_SHIELD flag. Looking at mc_check_subobj (line 821 of code/Model/ModelCollide.cpp), there is code for both shield and model hits. So the if the shield flag is sent, it MIGHT check the shield first. However, I can't find anyplace that checks shield first, then model if no shield, so I'm not sure if more code is needed...
Anyway, we need to determine shield face struck before the ship_apply_local_damage is called...