Perhaps you need to run your system command as a background process? The problem is that when you run a system command that seizes control of the current process, the Tk event loop doesn't get executed, so no window updates occur. If you call external programs in their own process, it allows the Tk events some processing time.
See below: (Windows example, adjust as necessary to call background processes in your OS)
use strict;
use warnings;
use Tk;
my $mw = MainWindow->new;
my $m = $mw->Message(-text => "testing, one, two, three...")->pack;
$mw->update;
system("start notepad.exe");
MainLoop;
For your sleep example? Well, if you don't call your event loop periodically, don't be surprised if your events don't get processed...