It doesn't. Put it in a loop and see for yourself: process memory does not increase with each loop iteration.
for(1 .. 10_000_000)
{
our @a = (1);
our @b = (1);
}
All that "leak" message is (probably) telling you is that the program exited with outstanding variables. To silence that message, undef the variables before the end of the program:
perl -MDevel::LeakTrace::Fast -e 'our @a = (1); our @b = (1); undef @a; undef @b;'
FWIW, the same message is printed under perl 5.10.0, so I'm not sure upgrading perl is the answer.
As for why the message appears in some cases but not in others, it's probably a vagary of Devel::LeakTrace::Fast. Many Perl leak detection modules have "idiosyncrasies" (putting it kindly) like this.
Bottom line: the only 100% reliable way to test for a leak is to see if memory usage increases with repeated execution of the code in question. When in doubt, fall back to that.
The various Devel::* modules can help, however. But first it's best to isolate the leaking code: disable half your code and see if the leak persists. Now you have narrowed your search by half. Repeat a few times and you'll quickly get down to the function or statement(s) that leak. Then see if that code still leaks when put in a separate script. Finally, to see why it's leaking, employ the Devel:: modules (e.g., checking for memory cycles with Devel::Cycle).