This really has nothing to do with autovivification, you never attempted to define $ENV{TMPDIR}, and $ENV{TMPDIR} never existed (through either you or autovivification, unless it was really defined as an environment variable before you enter the program) before or after.
The first argument you passed in is undef, which failed the join. Not surprisingly, comment out printf obviously will get rid of the error. Here is part of your code without that function:
use strict;
use warnings;
use Data::Dumper;
warn sprintf "In test, at start (1): TMPDIR '%s'\n",
! exists $ENV{TMPDIR} ? '<absent>' : ! defined $ENV{TMPDIR} ?
+ '<undef>' : $ENV{TMPDIR};
print Dumper(@ENV{qw(TMPDIR TEMP TMP)});
Which prints:
$VAR1 = undef;
$VAR2 = 'C:\\DOCUME~1\\someone\\LOCALS~1\\Temp';
$VAR3 = 'C:\\DOCUME~1\\someone\\LOCALS~1\\Temp';