As I said, by then they know it's an issue and the fd 2 has been introduced. The place to look is not the utilities, but the shell itself and what the kernel is doing in newproc et al for the tty handler.
With typesetter C -- we get dmr's new stdio library (libS.a) replacing Lesk's portable C library. This was released independent of V6 as what DEC would have called a 'layered product" that ran on top of V6. As I said, this is the language that Dennis and Brian describe in K&R (version 1).
With what was becoming UNIX/TS -- which don't seem to have a formal release -- we get what we all think of as the V7 kernel, Bourne's new shell and the new and updated tools suite as part of the system.
So with V7, as you point out, most, but not all of the utilities have been updated to start using the new compiler (since by then Lesk library is not included), If the code were recompiled, that code would have had to used the new FILE * structure over the small integer fd, for the printf family. With V6 there were still a handful of utilities in assembler (like snoball IIRC), but by V7 I think most of them had been culled.
And while your point is that you need to look at what each utility implemented, >>I believe<< that the key to Ron's question is what the shell and the kernel supplied [dates the idea], and >>then<< if the utility obeyed the new fd 2 as the error file is when it starts to be more formally enforced. So any further hunting should start there I would think.
Clem