One of the authors give an anwser:
Protocol 2 proves the following statement: "given a point P, there
exist vectors a and b such that P = aG + bH + *G". This problem
is that this statement isn't very useful. If I give you a point P,
it's nice to know that I can deconstruct it into some sort of inner
product thing, but in practice you typically know what should
be, and you want a proof that it's the correct thing. We'll call the
statement being proved here Statement 1.
So the statement we really want is "Given P and c, there exist vectors
a and b such that P = aG + bH and c = ". Same as above, but I've
moved the actual inner product "out of hiding" by taking it out of P
and making it explicit. Call this Statement 2.
The obvious way prove Statement 2, which we want, given only a proof
system for Statement 1, which we have, would be for the verifier to
compute "P' = P + cG" and ask for a proof of Statement 1 on P'. This
doesn't work, because a malicious prover could simply prove Statement
1 on a point P', then choose c to be whatever he wanted and provide c,
P = P' - cG to a verifier.
There are a few ways to prevent this. The tactic chosen in the paper
is to force the prover to choose P before he learns what G is. Then he
can't set P = P' - cG; for a given P' this is either true or it isn't!
Instead, the prover is forced to choose P' = P + cG, which is exactly
what we want him to.
So how can we force the prover to choose P before knowing G? Easy,
hash P to get a new value x and replace G with xG.