`Map` (`/@`) returns the results of the iterations of `AssociateTo` in a list and that is confusing you. You can suppress the output by using `Scan` instead of `Map`. Actually, the output of the mapped function is not of interest to you. What matters is the value of `test` afterwards, as `AssociateTo` uses call by reference.

 test = Association[{a -> 1, b -> 2, c -> 3}]
 Scan[
 (If[MissingQ[test[#]],
 AssociateTo[test, # -> 1],
 AssociateTo[test, # -> (test[#] + 1)]
 ]) &,
 {a, b, c, d, e}
 ];
 test

> <|a -> 1, b -> 2, c -> 3|>
> 
> <|a -> 2, b -> 3, c -> 4, d -> 1, e -> 1|>

Using `Scan` instead of `Map` increases performance since for returning the intermediate results of `AssociateTo` requires copying them. But that is what you actually try to avoid by using `AssociateTo` instead of using `Associate` recursively.
Here is an illustration of the performance difference:

 n = 100000;
 a = b = AssociationThread[Range[n], RandomInteger[10, n]];
 rand = RandomInteger[n, n];
 a == b
 Scan[
 (If[MissingQ[a[#]],
 AssociateTo[a, # -> 1],
 AssociateTo[a, # -> (a[#] + 1)]
 ]) &,
 rand
 ]; // AbsoluteTiming //First
 Map[
 (If[MissingQ[b[#]],
 AssociateTo[b, # -> 1],
 AssociateTo[b, # -> (b[#] + 1)]
 ]) &,
 rand
 ]; // AbsoluteTiming //First
 a == b

> 0.30575
> 
> 0.517976
> 
> True