If you add $::RD_TRACE = 1; to your script, P::RD will print out a trace of the parse which can help with the debugging. In this case, it shows that the /.+/ms pattern gobbles up "Z 034309201607258" (P::RD can't backtrack into the pattern, it will only backtrack whole rules). Your middle rule should leave the "Z" line at the end. For instance:
#!/usr/bin/perl
use strict; use warnings; use 5.014;
use Parse::RecDescent;
# $::RD_TRACE = 1;
my $text = <<'CONTENT';
Y 034309201607258 1
Q 02751VACANT / CLOSE
G ....
...
...
T RCRC 0810010
T RDRD 0810010
A 22OP
A 13O
A 12O
P 3472CHSK00010014
Z 034309201607258
CONTENT
my $parser1 = Parse::RecDescent->new(<<'GRAMMAR');
startrule : HeadRule OtherRule(s) TrailerRule
HeadRule : /^Y.+$/m
TrailerRule: /^Z.+$/m
OtherRule: /^(?![YZ]).*$/m
GRAMMAR
print "Valid data\n" if defined($parser1->startrule($text));
Also, your parser2 shows why you should almost always end your top-level rule with a /\Z/ pattern so that parsing fails if P::RD doesn't consume the whole string.