Because g is generator object.
Unlike listcomp which is calculated immediately, it's just a generator instance waiting to be iterated.
>>> from inspect import getgeneratorstate
>>> g = (x for x in range(4))
>>> getgeneratorstate(g)
'GEN_CREATED'
>>> next(g)
0
>>> getgeneratorstate(g)
'GEN_SUSPENDED'
>>> list(g)
[1, 2, 3]
>>> getgeneratorstate(g)
'GEN_CLOSED'
However, reference to first generator (x for x in range(4)) does not change inside generator object. Because g is just a reference on a object on memory.
Name is merely a post-it on a box. - Fluent Python.

So when we pass g, mere memory address of referencing object is passed, not g itself. Therefore, in following case:
>>> g = (x for x in range(4))
>>> g
<generator object <genexpr> at 0x036babbc>
>>> g = (add(n, i) for i in g)
g inside generator expression (add(n, i) for i in g) is merely passing mem-address 0x036babbc to expression, and generator instance created from that expression remembers that address, so even if g is redeclared that does not affect already created generator instances.
So in sequenece:
>>> g = (x for x in range(4))
>>> g
<generator object <genexpr> at 0x0452c22c> # 1
>>> g = (add(10, i) for i in g)
>>> g
<generator object <genexpr> at 0x044ee178> # 2
>>> g.gi_frame.f_locals['.0']
<generator object <genexpr> at 0x0452c22c> # 1 stored
>>> g = (add(10, i) for i in g)
>>> g
<generator object <genexpr> at 0x03bd88c8> # 3
>>> g.gi_frame.f_locals['.0']
<generator object <genexpr> at 0x044ee178> # 2 stored
As you see, each generator expressions remembers last referenced generator instances, so it's keep getting nested.