Because they aren't ready... they weren't identified because they were playing in a league that is not scouted much... any number of reasons. Take Puskarich for example, he played in the USHL when he was young and didn't produce much... he was 16-17 years old playing against much bigger, older, stronger guys. He then went to the NAHL and played... After a season of that he went to the BCHL, and he was recruited by UVM. so he comes in at 20-21
Santaguida is 21... hockeydb has no record before he was 19... when he played for the ojhl? The following year he moved to the BCHL and was recurited by Vermont.
Shaw is 21, played two seasons in the BCHL... meaning he was recruited as soon as he started playing that year. So these kids are going to the BCHL at 18, being recruited and coming in at 20-21. Consider that most programs are not bringing in kids immediately but lining them up for a year or two down the road. To bring in an 18 year old, you need to sign him up at 16 and that's a gamble coaches are trying to get away from.
Hoffman being an example of leagues... he played as an 18,19,20 y.o. in the SJHL. As a 21 y.o. he moved to the AJHL, a league VT recruits... he was brought in the following year... as a 22 y.o.
Another thing, kids start school later now, most of them are 18-19 when they actually graduate High School. A lot of them are still filling out, so why not let them fill out for a year in the USHL or some other top league so that for the 4 years you have them they aren't waiting on a growth spurt.