The OED would agree with Duo here. It gives the example of the difference between 250-year-old trees and 250 year old trees, pointing out that the latter is ambiguous because it could also have the meaning "250 trees that are one year old".
In the context of this sentence "three year old son" is totally unambiguous, because "son" is singular. It is also correct English (at least in the UK).
I used to prefer to avoid hyphens unless they were absolutely necessary. In this case, however, adding the redundant hyphens does make it harder to misunderstand.
It is not wrong to say "three years old", it is wrong to say "three years old son." Because this is not the way the English speaking say it. Perhaps because in "five thousand two hundred six years old men" it would be difficult to tell how many men are how old? 5002 106-year-old men? 5000 206-year-old men? 5200 6-year-old men?
While I can't speak to the correctness of saying, "He has a three years old son," I would have absolutely no problem saying, "He has a three year old son" (notice the lack of an 's'). That sounds like perfectly fine English to me, regardless of the fact that the meaning is ambiguous in spoken English.
This is correct. For whatever reason the number of years in a person's/thing's age is always treated as singular when using this form. X has a Y year old Z. However, Z is Y years old, the years again become plural.
I suspect that Ĵetkubo has explained at least part of the why. The rest of it can only be explained, by me, with an "I don't know."
Even though people probably would assume that if you said that you're saying it's his boy, or son, but I think it's just left with no ambiguity if you say Adamo has a three year old son because then it is definite the boy is his son and that he isn't just looking after him a while, for example.
Admins: I just reported "the audio does not sound correct." I wanted to be more precise. "There is no audio." I was doing this as a "write what you hear" sentence so the audio was acutely important. I wrote down "neniam" as my answer twice and then copied and pasted from the second time through for the third time.