It might be a little easier to get away from the syntactic-sugary [a..b]
stuff, and think about a simple function from the Prelude:
repeat :: a -> [a]
repeat x = x : repeat x
You should forget about evaluation for now and start thinking declaratively, i.e. think of the above like a function in mathematics which can be read:
"repeat x" means "x" consed with "repeat x"
Yes, "lazy evaluation" is what we call what allows us to express this, but ideally we'd really like to just forget about evaluation and think about what our code means. In imperative programming you are obligated to think about evaluation at all times.
Here is more or less what your [1..]
desugars to:
enumFrom n = n : enumFrom (succ n)
and you can see in @tel's answer how the compiler goes about expanding that.