You are very close: you need to move the my $address out of the loop so the value is remembered across iterations.
Example: (untested)
my $address;
while (<IN_FILE>) {
$address = hex $1 if m/address:([-[:xdigit:]]+)\s+/;
next unless defined $address;
if ($address & 1) { print OUT_FILE1 $_ }
else { print OUT_FILE2 $_ }
}
This is a very basic finite state machine. The $address lexical holds state (the most recent address seen) across loop iterations. There are a few other changes as well. First, the builtin $_ is used instead of a lexical to hold the input line; since pattern matches also default to using this variable, some clutter can be removed. Second, the address value capture is combined with the test for its presence and the statement modifier form is used. Third, no output is produced until an address has been seen (the next unless defined $address provides this feature). Lastly, the address is being stored as an integer, so an integer bit test is used instead of converting it back to a string.