Not at all. Solve, or NSolve might be giving ArgMax a non-numerical variable, but I don't know how to prevent that. Here is the relevant piece of code again (the original had Solve, now it's NSolve:
sol2 = NSolve[{v1n == ArgMax[f1[r, v1, v2n, x1star, x2star], v1],
v2n == ArgMax[f2[r, v1n, v2, x1star, x2star], v2]}, {v1n,
v2n}][[1, 1]]
v1n and v2n are both real numbers, but perhaps NSolve takes them as something else in intermediate steps. How could this be reformulated?