Note that And uses short-circuit evaluation, and count for how many numbers computing the GeometricMean will be necessary:
Length[Select[
Range[100,
1000000], (a = IntegerDigits[#]; b = RotateLeft[a];
c = RotateLeft[b];
IntegerLength[FromDigits[b]] == IntegerLength[FromDigits[c]] ==
IntegerLength[#] && Length[Union[b]] >= 3) &]]
(* Out[17]= 805752 *)
but if the last condition used ==, there would only be 67896 -- much less work.
Also, the timings should improve if you use GeometricMean[{N[n], FromDigits[b]}], since machine precision computation is faster.