Das i hat den Wert, den es am Schluss der Schleife hat. Du erzeugst kein neues i, es ist immer das gleiche in der anonymen Funktion.
Das einfachste ist eine neue Referenz in einem neuen scope erzeugen
Code:
TabsComms[i].onclick = function(p) {
return function() {alert(p);} ;
}(i);
Wobei ich mich aber Frage, warum du diesen i brauchst, wenn es sich um eine HTML Tabelle handelt, hast du die Spalte in der Tabelleneigenschaft.
Code:
document.querySelector('table').addEventListener('click', function(e) {
var o = e.target;
if(o.cellIndex) alert(o.cellIndex);
});