It's because the first or "default" root Reduce finds is between -2 Pi and 0. Restricting to the interval [0, 2 Pi] apparently makes it go through a whole bunch of work to find the right branch. (Why, I can only speculate. Perhaps because of the inequality in testeqns. Obviously, it does not take the general solution and then restrict it to the specified domain as shown below.)
The following demonstration is really only possible in hindsight:
Reduce[testeqns, p];
Reduce[Flatten@{%, 0 <= p <= 2 Pi}, p]
(* Out:
C[1] == 1 &&
p == 2 ? + 2 ArcTan[Root[11 + 4 #1 - 13 #1^2 + 28 #1^3 + 48 #1^4 - 4 #1^5 - 61 #1^6 - 28 #1^7 + 11 #1^8 &, 2]]
*)
res = Reduce[Flatten@{testeqns, -2 Pi <= p <= 0}, p]
(* Out: p == 2 ArcTan[Root[11 + 4 #1 - 13 #1^2 + 28 #1^3 + 48 #1^4 - 4 #1^5 - 61 #1^6 - 28 #1^7 + 11 #1^8 &, 2]] *)
You may have already explored this, but
Solve[testeqns, p, Method -> Reduce]
uses Reduce to solve the system. And
NSolve[testeqns, p, Reals]
returns the solution. (Note the Reals are only partially implied by the use of the inequality in testeqns. The terms could be complex that evaluate to a real number. So if you meant the equation to be over the Reals, then specifying the domain helps a lot in this case.)