Already read the documentation contained in the pf version 5.4 of openbsd but still not clear to me why it is necessary to use match out and pass out to create a NAT rule.
Could someone explain better, please?

In the following snippet, the match rule dictates that every packet passing out through the external or egress interface will undergo Network Address Translation.

Code:

match out inet from ! (egress) to any nat-to (egress)
block log all
pass out quick on egress inet proto udp from any to any port = 53
pass out quick on egress inet proto tcp from any to any port = 53
pass out quick on egress inet proto tcp from any to any port = 80

Because I have I block log all policy, I need pass rules to actually allow selected types of packets to go out.
Once they are are allowed to pass, the match rule kicks in and does the NAT.

The nat on rules can be converted directly into match rules, as outlined in the pf(4) NAT syntax change section of the OpenBSD 4.7 Upgrade Guide, which described the transition. This syntax dates from that release.

Your rules:

Code:

nat on $ext_if from $srv01 to any -> $ext_if_fw
nat on $ext_if from $srv05 to any -> $ext_if_fw

are likely to translate directly to:

Code:

match out on $ext_if from {$srv01 $srv05} nat-to $ext_if_fw

I say likely because as J65nko has pointed out, you have only shared a fragment of your ruleset, and your variables are unknowns. My proposed syntax will apply nat-to to later pass rules that apply.