Hi David,
Unlike many other languages, WL syntax maps to an underlying symbolic expression. It may be helpful to look at that expression to understand it better
(n_ /; IntegerQ[(2^n - 2)/n] && PrimeQ[n] == False) // FullForm
(n_ /; IntegerQ[(2^n - 2)/n] && PrimeQ[n] == False) // TreeForm
(IntegerQ[(2^# - 2)/#] && Not[PrimeQ[#]] &) // FullForm
(IntegerQ[(2^# - 2)/#] && Not[PrimeQ[#]] &) // TreeForm
Define functions (with good names) to encapsulate logic and simplify complex expressions
pseudoPrimeQ[n_] := IntegerQ[(2^n - 2)/n] && Not @ PrimeQ @ n
Cases[Range[550, 1200], n_ /; pseudoPrimeQ[n]]
Cases[Range[550, 1200], n_?pseudoPrimeQ]
Range[550, 1200] // Select[pseudoPrimeQ]