Ok, that's quite some language-lawyering going on here ;-), and while I enjoy it, I'm completely aware of the fact that in practice the behavior of actual implementation (in software, compilers, operating systems) always trumps theoretic considerations.
That being said...
§6.5.3.1/4 The unary * operator denotes indirection. (...) the result is an lvalue designating the object.
So, I believe that there will be no difference in access to something declared as
volatile X v;
v = ...;
and
X v;
*((volatile X*)&v) = ...;
if the access to v will
always be performed through such a cast, as
((volatile..)) will always denote the same "volatile" X object stored in v, independent of the fact that storage to the volatile X object is allocated in a "nonvolatile" X object.