Here is a procedure to achieve your aim: First we gather all parts with the same position:
(old = Select[GatherBy[lab, (#[[1, 1]]) &], Length[#] > 1 &])
Then we join the labels for points with equal positions:
new = ({#[[1, 1, 1]] -> ToString[Join[#[[All, 1, 2]]]]}) & /@ (old =
Select[GatherBy[lab, (#[[1, 1]]) &], Length[#] > 1 &]);
Then we replace the parts with equal positions by the joined labels:
lab = Join[DeleteElements[lab, Flatten[old, 1]], new];
All together:
lab = {{{1, 4} -> "A"}, {{2, 2} -> "B"}, {{3, 1} -> "C"}, {{3, 7} ->
"D"}, {{4, 5} -> "E"}, {{4, 5} -> "F"}, {{5, 3} ->
"G"}, {{6, 6} -> "H"}};
new = ({#[[1, 1, 1]] -> ToString[Join[#[[All, 1, 2]]]]}) & /@ (old =
Select[GatherBy[lab, (#[[1, 1]]) &], Length[#] > 1 &]);
lab = Join[DeleteElements[lab, Flatten[old, 1]], new];
ListPlot[lab]
