match out on $ext_if proto {tcp, udp} from $bmpc_wks to any port>=80 queue bmpc set prio 7
match out on $ext_if proto {tcp, udp} from $int_if to any port>=80 queue std set prio 3

The firstmatch rule applies to your selected workstations. The secondmatch rule applies to ALL devices on your LAN, including the selected workstations.. The second match rule replaces the bmpc queue with the std queue. That is why the bmpc queue is never used.

Since your std queue is your default queue, you do not need the second match rule in your rule set.

Queueing: your "set queue" rules are pass rules are located among your queue rules, before the comment line: "#****** THIS IS WHERE THE RULES BEGIN ******". Queue settings are not sticky when used in pass rules, and unless quick is used with pass, the last matching rule wins. Without looking very far, I can see rules that will match the same traffic and override your earlier pass rules that set queue.

You might consider using match rules to set queues, or, use the quick option.

Blocked traffic: Your general block rule is on inbound traffic. No outbound traffic is blocked except for IGMP. Did you enable the packet forwarding sysctl? If no, this is the root cause. If yes, then either simplify your rule set, or enable logging on each rule and use tcpdump(8).