"If there aren't any rows in b, count returns '1' for each row,"
on which database? I can't reproduce that on postgresql nor on mysql.
"Best I can figure is NULL is being counted, but why only if there are no rows in b?"
That's the whole point of doing an OUTER JOIN. All other JOINs will return no records fro the LEFT table if there is no mathc in the RIGHT table.
Only the OUTER JOIN will return records regardless of wether there is a match or not, and if there is no match, the 'missing' record is filled with NULL values.
A forum, a FAQ, what else do you need?