Thanks, that's right. Its because io() will emit an overloaded object so stringification would trigger.
You'll have to "peel off" the overloading, so to speak, by invoking overload::Overloaded (though funny, the perldoc says this should "true if 'arg' is subject to overloading...", wasn't expecting an actual GLOB object there.)
% perl -de 0 -MIO::All -MData::Printer
Loading DB routines from perl5db.pl version 1.51
Editor support available.
Enter h or 'h h' for help, or 'man perldebug' for more help.
main::(-e:1): 0
DB<1> $io = io '.zshrc'
DB<2> x overload::Overloaded( $io )
0 GLOB(0x17a4378)
-> *IO::All::((
DB<3> $o = overload::Overloaded( $io )
DB<4> Data::Printer::p($o)
\ *IO::All::(( (layers: )
DB<5>
It would probably make a nice exercise to implement a Data::Printer filter for this.