Yes, quite a few people survived the attack on Reach. If I'm not mistaken, a few of the SPARTAN-IIIs were Reach survivors. But I'd say a couple thousand people got off Reach. Just because a planet is under attack doesn't mean that everyone dies. I'd presume the UNSC staged a pretty serious evacuation for civilians when the Covenant first popped up.
Reach isn't necessarily the closest planet to Earth. I'd say there were a few beside it, but none were nearly as important. Reach was primarily colonized because of its similarities to Earth (27 hour days, 390 day years, 1.08 Earth gravity, etc), as well as it's rich Titanium deposits, which are vital to the UNSC fleet for construction, repairs, armaments, etc.
Now, like everyone else said, the cryo sleep is what accounts for the age disrepencies. Take note of Harvest's fashion styles, which the book temporarily hits on: Johnson recalls seeing dresses that were easily 6 months to a year out of fashion. The reason for this is that Human slipspace technology can only propell the fastest of UNSC ships through slipspace at a rate of 2.625 lightyears per day. Now, look at Earths closest neighbor 4.37 lightyears away, which means it'd take roughly 4 days and some hours to get too. Not too bad, right?
Ok, now lets look at another one of Earths well known neighbors: Betelgeuse. Betelgeuse is located aproximatly 640 lightyears away. If we followed the UNSC's slipspace speed, 2.625 LPD, you'd get there in about 243 days. Again, thats not really bad, but it's certainly a timeperiod where cryosleep would be preferred. So, upon arival at Betelgeuse, you'd be 243 days younger then your Earthen counterparts. Thats not alot in the grand scheme of things, but it will certainly put an effect on how you count your age.
So, you've got 243 days to Betelgeuse. For a colonist, that isn't really a bad thing. 243 days won't really be missed or noted, and in comparison to Earth, there'd be little difference. Now, let's say that there a bunch of planets all aproximately the same distance from Earth. Again, no biggy. Colonists go, they deal with it, no problem. But what if theres a WAR? Now you throw soldiers into the mix, and these soldiers are routinely going into cryo-sleep during cross-planet jumps. If a soldier fights on, say, 6 planets and spends a week at each, the soldier isn't spending 6 weeks (42 days) away from home. He's actually spending 3882 days (10.5 years) away from home.
With an enemy like the Covenant or the Insurrectionists, you can pretty solidly expect the UNSC to be constantly shuffling soldiers around the universe, spending only small amounts of time at each location. With my above demonstration, you can understand how soldiers would often come home and their family is gone.
Sad, huh?
So, in Johnson's case, he fought as a SPARTAN-1, a trainee of the ORION Project, meaning he was a pretty damn important soldier. Johnson was known to have participated in two specific operations, KALEIDOSCOPE and TANGLEWOOD, as well as dozens of others as an S-1 ORION soldier. He also partook in Operation Trebuchet, the 1st Battle of Harvest, the Battle of Paris IV, the Battle of Reach, the Battles of Installations 04, 05, 00, and 04B respectively, Operation FIRST STRIKE, and the Battle for Earth.
So, right there, you've definitively accounted for 12 specific engagements with the Covenant, not including the dozens he partook in during his time in the ORION project.
Plus, most of these engagements are FURTHER away from Earth then both Betelgeuse and Alpha Centauri, so transit time is greatly increased.
Further taking into account for older Shaw-Fujikawa engines before 2550, I'd say that it's fairly easy to believe that, by following DOB/DOD, Johnson is easily 80 years old. Now, in reality, I'd guess that Johnson is biologicaly 35-45 years old, which would be pretty average for a Sergeant Major lifer.
So, the books are very accurate to the Halo universe. Joe Staten, being the writer for the Halo game franchise in the first place, would probably not make that kind of mistake.