Assuming that \ts are actually tabs, and that the occurrences are on the same column, and that A only matches A, not AA. Let a be the file with A,B,C and b the file where you want to count matches on (the second one you provided).
First, you need to get only the possible matches from b, ignoring everything else. This is the third column of b, so we can use cut that is, well, intended to cut parts of a file
cut -f 3 b
Then, you need to turn this into a list of occurences and their counts: you can sort and use uniq to count those, on the output of cut
sort | uniq -c
Finally, you did this for all values in b, but you only want those from a. You can use join which joins two different files on common fields (in this case, the first and only field of a (it seems to do that by default) and the second field (2) of b, which is the second file (-2)
join -2 2 a result-from-b
You can chain this in several different ways, a possible way is using named pipes from bash's process substitution:
join -2 2 a <(cut -f 3 b | sort | uniq -c)
This should at least be better than individual greps, as you only process b thrice (remove other columns, sort, and uniq) and then I suppose the join will only read each file once, as it requires the inputs to be sorted. Of course this relies on the assumptions I made (and you also have to sort a, but that's just <(sort a) instead of a if it was not sorted before.