I asked George Timson. Here's his reply:
$P is the device when the process was started, not necessarily the
current device. It might have been closed by the process, requiring its
re-OPENing. Or in some cases, when the process is a background job, it
never is really a useable device; I think in some such cases I have even
seen $P equal the null string. In any case, I am just doing what the
commented-out code on the same line used to do without the $P syntax;
IO(0) was always, by convention, the starting device.
--
And I checked with Rick; opening $P is not disallowed in the '95 standard.
Sam