"What's wrong with your approach" is that this isn't the module pattern, revealing or otherwise. If you meant to use it, use it, and make that function self-invoking:
var myScene = function() {
var c1 = myPaper.circle(50, 50, 40);
var c2 = myPaper.circle(50, 150, 40);
var c3 = myPaper.circle(50, 250, 40);
c2.attr("fill", "red"); // yep!
return {
firstCircle: c1 // ← refer to a variable which is actually defined
};
}(); // ← parens go here
You don't later call myScene
as a function, because it isn't a function, and that anonymous function has already been called. And look, you still get access to that circle!
console.log(myScene.firstCircle); // z {0: circle.[object SVGAnimatedString], node: circle.[object SVGAnimatedString], id: 0, matrix: cb, realPath: null, paper: j…}
Omitting the parentheses (which call the anonymous function) leads to a very different outcome, as you have found.