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]