I'm convinced this is a bug in SpriteKit.
Anyway, here is one solution for the problem (Actually, this is more a workaround than a real solution but...): Wrap the sprite in a container node. Also, container node holds the physicsBody while the child node is merely a graphics node. This way you can safely flip the sprite using xScale without affecting the physics of the node.
// Init
{
SKSpriteNode* turtleSprite = [SKSpriteNode spriteNodeWithImageNamed:@"turtle.png"];
self.turtleSprite = turtleSprite;
SKNode* turtleWrapper = [SKNode node];
turtleWrapper.physicsBody = [SKPhysicsBody bodyWithCircleOfRadius:turtleSprite.size.width/2];
turtleWrapper.physicsBody.categoryBitMask = 2;
turtleWrapper.physicsBody.collisionBitMask = 1;
turtleWrapper.physicsBody.contactTestBitMask = 1;
[turtleWrapper addChild:turtleSprite];
[self.world addChild:turtleWrapper];
}
// Elsewhere
{
self.turtleSprite.xScale *= -1;
}