I think what happens is that round-off error means the lengths are computed to a real number that differs from 1. by 2.*10^-16 or so. These lengths are rescaled, by default, to the domain of color function, which domain is [0,1]. So the different colors reflect only whether the round-off error was a small positive or negative number somewhere in the range \pm2\times10^{-16}.
If you would like a way to plot the field without such small variation in length appearing as if it were a large one, consider using WorkingPrecision as follows:
f = Sqrt[x1*x1 + x2*x2];
f1 = D[f, x1];
f2 = D[f, x2];
VectorPlot[{f1, f2}, {x1, -1, 1}, {x2, -1, 1},
PlotLegends -> Automatic, WorkingPrecision -> 16]
Another way is to use the option VectorColorFunctionScaling -> False.