Sorry for the delayed reply. I only had time to look at this now. *caveat* I haven't had to do pty-related coding in a while, so my knowledge of the 'tricks' is hazy.
I looked over the code in IO::Pty::Easy and IO::Pty, and it looks like it always handles the case where there is no tty associated with the process. What I would probably do is run the program using strace (ie, have xinetd call a shell script which runs "strace <perl-script> >& /tmp/data.out" And look for unexpected system call failures.