Where are global variables really stored?
Global variables are made properties of a lexical environment in a global execution context, the same as function variables are made properties of a function lexical environment.
For convenience, they are also made properties of the global object.
I am currently reading a book that says that global variables are stored as attributes of the global execution context object.
More or less. Terminology was changed for ES5, previously there was a concept of a variable object to store variables within an execution context, but it was only a specification device and not an actual object that could be accessed.
ES5 references a lexical environment, which includes a variable environment, see EMCA-262 §10.3
But the link I included in the first paragraph says that they are properties of the Window object.
Within a browser, the window object is effectively an alias of the global object. window is a host object, so it can have more properties and methods than the built–in global object.
So what is the relationship between the Window and the Global Execution Context object, if any?
I think that's explained above. In short, in a browser, the global and window objects are effectively (but not exactly) the same thing.
If none, is the book I'm reading wrong?
No, but it seems to have confused you. ;-)
See also: MDN: Window.window
windowobject. Thewindowobject is the global object in browsers.windowbut still refers to the global object