Quartz will probably optimize setting hidden = YES on a hidden layer, but if you really want to find out you should benchmark.

+1  A: 

Why not do this:

- (void)setCharacterLeftFlag:flag {
    if ( flag ) {
          characterLeftView.layer.hidden = NO;
          characterRightView.layer.hidden = YES;
     else {
          characterLeftView.layer.hidden = YES;
          characterRightView.layer.hidden = NO;

this is your setter. Now, the OS may not even call drawRect, if it sees that the layer is hidden, and doesn't need to be redrawn.

You are correct. As with so many people, I am relatively new to Cocoa and CoreAnimation. I realized shortly after posting that 1) calling setHidden as often as you like does not directly effect the performance and 2) follow the pattern you describe above and do everything in the state mutators, and 3) do not do anything in drawRect: if you do not have to. I was forcing the call to drawRect by issuing the setNeedsDisplay.
In fact, you never know when a mutator would actually turn around and call drawRect itself! More likely it would call setNeedsDisplay.