Just switching to use lexicals instead of package variables should avoid global destruction and let your objects be destroyed as their refcounts dictate, e.g.:
$ perl -w
sub DESTROY { warn $_[0]->{name} }
my $inner = bless {name => "inner"};
my $outer = bless {name => "outer", inner => $inner};
__END__
outer at - line 1.
inner at - line 1.