The answer has to do with the difference between Rule(->)
and RuleDelayed(:>)
:
Rule:
h = h1 /. Derivative[q_, r_][p][x, v] -> dpdx[q + 2*r]/(2^r)
RuleDelayed:
h = h1 /. Derivative[q_, r_][p][x, v] :> dpdx[q + 2*r]/(2^r)
Rule a -> b first evaluates the expression b and then replaces a with b. RuleDelayed a :> b first replaces a with b, holds the expressions in b unevaluated and then evaluates b.
In your case, if just Rule (->) is applied:
dpdx[q + 2*r]/(2^r)
its directly evaluated to
2^(1/2 - r)*E^(x^2/(2*v))*Sqrt[Pi]*Sqrt[v]*
D[1/(E^(x^2/(2*v))*Sqrt[2*Pi]*Sqrt[v]), {x, q + 2*r}]
In this step the FullSimplify allready has been applied to the expression. But v and r where still symbolic and could not have been more simplified. RuleDelayed first puts in the values of v and r, evaluates this expression, and replaces the full simplified expression.
EDIT:
You can actually see the difference by the colloring of variables in the Mathematica FrontEnd. With x_ -> Simplify[x], the right side x is collored blue, wich means that its global, not protected from evaluation. It just evaluates to x_-> x, since Simplify[x] is just x.
With x_ :> Simplify[x] the x on the right side of the rule is collored in green, like the pattern itself, wich means, that its treated kind of a local variable inside of the rule, protected from evaluation untill the rule has been applied.
I remember, when i first understood the difference, it also took me a while to realize, but after the "penny drops" its clear and very usefull to know.
sacratus