I had the same issue updating my CALayers through another thread. If i called any of the following lines directly in the same thread it worked perfectly:
[self setNeedsDisplay:YES];
[self needsDisplay];
[self.circleLayer needsDisplay];
[self.circleLayer setNeedsDisplay];
But when calling these through another thread, there was no change. I played around a bit and ended up using
[self display];
which was the only thing that forced the CALayers to update. Self is an NSOpenGLView which contains several layers and sublayers. Maybe this can help. Every CALayer has the same method available. Maybe you should call display.