I'm not quite sure what the reason is, but it looks like neither PlotRange -> All nor PlotRange -> Full are correctly capturing the real plot range. It's especially weird to me since the legend seems to say that the range goes from 0 to 0.25.
First I tried SliceDensityPlot3D with PlotPoints -> 120 and PlotRange -> Full to try and see what was happening at those minima.
w = 0.02;
a0 = 1.5;
a = {1, 0.9/a0, 0.6/a0};
{R1, R2} = {
{-a[[1]] Sqrt[1/4 - (w/(1 - a[[3]]))^2], 0, w/(1 - a[[3]])},
{a[[1]] Sqrt[1/4 - (w/(1 - a[[3]]))^2], 0, w/(1 - a[[3]])}
};
maxX = 1.2 R2[[1]];
maxY = 0.2;
maxZ = 0.2;
V[X_, Y_, Z_] := (X^2/a[[1]] + Y^2/a[[2]] + (Z - w)^2/a[[3]]) -
Sqrt[X^2 + Y^2 + Z^2] + 0.250667;
SliceDensityPlot3D[
V[X, Y, Z],
"CenterPlanes",
{X, -maxX, maxX},
{Y, -maxY, maxY},
{Z, R1[[3]] - maxZ, R1[[3]] + maxZ},
PlotPoints -> 120,
MaxRecursion -> 5,
PlotRange -> Full,
PlotLegends -> Automatic,
LabelStyle -> Directive[20],
AxesLabel -> {"X", "Y", "Z"},
ViewPoint -> {0.7, -2.6, 0.7},
ImageSize -> 700,
AspectRatio -> 1/2
]

This shows that the function has 3 holes in it (if you rotate the plot you can see an additional one hidden close to the origin. Your function is looks well-behaved, so it shouldn't have anywhere that evaluates to a complex number or infinity or anything.
So I tried manually specifying PlotRange -> {0, 0.25}. I actually got rid of the PlotPoints because there was one very small point in the orange/white area near the origin that seemed to be excluded. It looks like the maximum occurs at (0, 0, 0) and is about 0.2516667. If you want high plot points, you'll have to extend the plot range a bit further too.
SliceDensityPlot3D[
V[X, Y, Z],
"CenterPlanes",
{X, -maxX, maxX},
{Y, -maxY, maxY},
{Z, R1[[3]] - maxZ, R1[[3]] + maxZ},
MaxRecursion -> 5,
PlotRange -> {0, 0.25},
PlotLegends -> Automatic,
LabelStyle -> Directive[20],
AxesLabel -> {"X", "Y", "Z"},
ViewPoint -> {0.7, -2.6, 0.7},
ImageSize -> 700,
AspectRatio -> 1/2
]

If we apply this same fixe to the original plot:
plot = DensityPlot3D[
Evaluate@V[X, Y, Z],
{X, -maxX, maxX},
{Y, -maxY, maxY},
{Z, R1[[3]] - maxZ, R1[[3]] + maxZ},
PlotRange -> {0, 0.25},
PlotLegends -> Automatic,
PlotPoints -> 120,
OpacityFunction -> 0.05,
LabelStyle -> Directive[20],
AxesLabel -> {X, Y, Z},
ViewPoint -> {0.7, -2.6, 0.7},
ImageSize -> 700,
AspectRatio -> 1/2]

That seems to fix it. The reason it was less blue in the original is because it wasn't plotting anything due to the holes. So the optical density through that part of the graph really was less.
If you haven't checked it out yet, SliceDensityPlot3D and SliceCountourPlot3D have some really cool options in terms of stacked planes, diagonal planes, spheres with octants cut out, or custom surfaces to plot over. I think in a lot of cases, it maybe be more intuitive for understanding 4D plots. They may not be what you need for this particular plot since you are already plotting some other curves along with it, but I think they're worth using when possible!
PlotPointsyou may miss or obscure features. TryPlotPoints -> 120. However, trying to do analysis based on subtle differences of color shading is likely to be futile. $\endgroup$OpacityFunction->0.05andOpacityplays tricks on the eyes. You can see that the defaultOpacityFunctionshows the structure you expect. Moreover, the function will be sampled differently (unless usingPlotPointsas @BobHanlon suggests) and this opacity will really screw you over. $\endgroup$PlotPoints, but it makes the plot less transparent and one cannot see the feature inside the bulk, which is not good for the visualization purpose. The defaultOpacityFunctionhas the same problem. And with morePlotPoints, once you further reduceOpacityFunction, the unrealistic small pale ball reappears. $\endgroup$OpacityFunction. What if you use e.g.OpacityFunction -> "Image3D"orOpacityFunction -> (Exp[-9 #] &), if you want a quickly decaying opacity? $\endgroup$