Good catch. This seems indeed to be a bug in grep (Tested with GNU grep 3.4 and 3.7):
grep -ow "n[0-9]=*"
grep -Eow "n[0-9]=*"
return only first match (or probably rather matches only the first one),
while ...
grep -Pow "n[0-9]=*"
... returns all matches as expected.
To report bugs for GNU grep, check here.
However, I cannot confirm your observation that -P [...] doesn't seem to keep the -w description, for me (GNU grep 3.4 and 3.7), the command outputs as expected:
$ echo 'n1=1 n2= n3=3 n4=' | grep -owP "n[0-9]=*"
n1
n2=
n3
n4=