From what I can see, in your example raycasting works fine and intersects variable is not empty. The problem is that as you are using TrackballControls, the rendering is performed only when the camera changes its position. That is why a small drag of the mouse results in changing the color of the box.
Below I included your animate function with one new call to render function. This solves the problem. However, note that this is not the most efficient solution as the rendering is performed every frame.
function animate() {
try{
requestAnimationFrame( animate );
controls.update();
render();
}
catch(err){
alert("animate error. " + err.message);
}
}
Hope this helps!