When I run your code I don't get that warning. Please try to post a small script that we can execute to reproduce the warnings. Then we can actually tell you how to avoid it.
There's nothing in your update that generates a warning either.
use strict;
use warnings;
BEGIN { package My::Guard; sub new {} }
{
my $sth;
my $guard1 = My::Guard->new(sub { $sth->finish });
my $guard2 = My::Guard->new(sub { $guard1; });
}