Your problem description isn't very clear, but I think the issue is that you stop listening once you've received the 'ON' response. You print "message received" then the return out of testall_aspects, so there nothing left to listen for the 'off' message.
To deal with asynchronous messages from the arduino you could use a repeat callback to poll the serial port (see Tk::after and Tk::callbacks), something like :-
$widget->repeat(100,\&handler);
...
sub handler {
my $data = $port->lookfor;
return unless $data;
# do stuff
...
}
Also, with this kind of problem it's worth drawing a sequence diagram to show how the messages get passed between the 2 systems.