You are right. MSVC doesn't allow typedef redefinition after all.
Here is a code simplification of what is happening in windows.hstruct A {
char a;
char b;
};typedef int foo[1];
typedef int foo[(long)&(((A *)0)->b)];
This looks like an offsetof implementation. We're probably not treating it as a constant expression (but that's another guess), since C/C++ doesn't consider it to be a constant expression (GCC and VC++ have extensions in this area).