The reason why the sounds are playing for every collision is because you literally have a loop that is running for every collision of the trace.
So if the trace hits 10 things, that loop will run 10 times, the only thing that needs to be satisfied is that one Boolean. So its running multiple times because of that.
Instead, take the code for checking with the Boolean and playing the sound code, and move it to the completed exec pin on the loop.
your code should probably instead look something like this.
For (hitTraceArray):
if current hitTrace struct in array has valid hit;
set containsHit to True;
(then on the completed node)
if containsHit is True
play sound;
if not, play other sound;
(Let me know if that helps)