If the arrays are allocated, then it is alright to use them in both read and write. The problem is when a component is unallocated on write, or unallocated when it is specified in the namelist read.
I think the standard could be extended in a consistent way to allow something like allocate-on-read for both namelist and list-directed i/o. I think this could be done in a backwards compatible way so that old code behaves the same as before. This has the potential to be both more efficient and easier to use than the current conventions.