First, the standard really does say that if the shapes of the LHS and RHS match, no reallocation is done.
10.2.1.3 Interpretation of intrinsic assignments
Paragraph 3 spells out what happens if the LHS is an allocated allocatable variable. The first step is “it is deallocated if expr is an array of different shape, any corresponding length type parameter values of the variable and expr differ, or the variable is polymorphic and the dynamic type or any corresponding kind type parameter values of the variable and expr differ.” In essence, if the end result is going to be the same shape (and same other attributes), it doesn’t get deallocated and reallocated. Yes, this does take some time for the checks. But note how extraordinarily useful this is for deferred-length allocatable character variables so that if the lengths differ, the variable now has the length of the expr.
As for use of (:,:,:), I agree that if you know that the shapes will be the same that this can save you a bit of time with the checks, though as noted, if the arrays are large the difference will be noise. I still don’t care for the superfluous bounds, but if you have a good reason for them, I don’t object.