It's too late to be poking at things but I think the problem is that the argument validation is trying to coerce "CST" into a DateTime::TimeZone before it's done anything to do looking at your mapping. I think what that argument is for is providing a mapping for zones if they're named in the date which is being parsed. Tweaking your code slightly:
#!/usr/bin/env perl
use strict;
use warnings;
use 5.010;
use DateTime;
use DateTime::Format::Strptime;
$|=1;
my $str = 'Wed, 13 Jan 2021 17:22:23 CST';
my $pattern = '%a, %d %b %Y %T %Z';
my $strp = DateTime::Format::Strptime->new(
pattern => $pattern,
zone_map => { CST => '-0700', EST => '-0600' }
);
say "I got this far (not!)";
my $dt = $strp->parse_datetime( $str );
say "String: $str";
say "DateTime: $dt";
say "zone: ", $dt->time_zone->name;
say '';
__END__
$ perl tz_thing.plx
I got this far (not!)
String: Wed, 13 Jan 2021 17:22:23 CST
DateTime: 2021-01-13T17:22:23
zone: -0700
The cake is a lie.
The cake is a lie.
The cake is a lie.