The first thing I noticed is that in one loop in the template, you've got three tokens all with the same name, so they'd get the same data.
In your for loop in Perl, and in the template loop, give each of them different names (key1, key2, key3, or hopefully something more meaningful).
You're also pushing to the array (in other words, making a row to display) once per hash key - you actually want one row per machine.
This is entirely untested code, but give this a try. Set the template tokens to match your data's keys (key1,key2,key3), and try this loop.
for $user ( keys %HoH ) {
for $machine ( sort keys %{ $HoH{$user} } ) {
%row_data = ();
$row_data{MACHINE} = $machine;
for my $key ( sort keys %{ $HoH{$user}->{$machine} } ) {
$row_data{$key} = $HoH{$user}->{$machine}->{$key};
}
push @{$loop_data}, \%row_data;
}
}