It's a matter of variable scope and the real google object lives within the gmaps4rails proxy object:
handler.buildMap({ provider: {}, internal: {id: 'map'}}, function(){
var polygons = handler.addPolygons(<%= raw @myhash.to_json %>);
for (var i=0;i < polygons.length; i++){
var polygon = polygons[i];
google.maps.event.addListener(polygon.getServiceObject(), "click", function(evt) {
alert("hello!");
});
}
}