Dave, I've had a quick look through your .fla and I can't see any major reason why it would run at different speeds because of the movie it's in - that's pretty weird.
The major load on the CPU seems to be the tweening within the MCs.
But I think I've found some ways to speed it up in general, it's just a cursory glance and I could be missing the point of what you were going for (if so I apologise in advance

) but these seem logical...
1)
myrandom = Number(random(4))+1;
for (z=0; z<4; z++) {
foof = eval("_root.game.grinch"+z);
if (myrandom == z) {
foof.play();
}
}
could be replaced by
myrandom = Number(random(4))+1;
foof=eval("_root.game.grinch"+myRandom);
foof.play();
...which saves a few cycles.
2)
onClipEvent (enterFrame) {
if (this, hittest(_root.game.grinch1)) {
_root.game.grinch1.grinch.gotoAndPlay("end"
;
_root.game.hits = _root.game.hits+1;
} else if (this, hittest(_root.game.grinch2)) {
_root.game.grinch2.grinch.gotoAndPlay("end"
;
_root.game.hits = _root.game.hits+1;
} else if (this, hittest(_root.game.grinch3)) {
_root.game.grinch3.grinch.gotoAndPlay("end"
;
_root.game.hits = _root.game.hits+1;
} else if (this, hittest(_root.game.grinch4)) {
_root.game.grinch4.grinch.game.gotoAndPlay("end"
;
_root.game.hits = _root.game.hits+1;
}
}
could be done with...
onClipEvent (enterFrame) {
for (i=1; i<5; i++) {
badGuy = eval("_root.game.grinch"+i);
if (this.hitTest(badGuy)) {
badGuy.grinch.gotoAndPlay("end"
;
_root.game.hits++;
}
}
}
...which is cleaner (although not necessarily faster).
3)
onClipEvent(load){
stop();
}
...doesn't actually do anything because clipEvents don't work with frames.
One major timesaving would be to run the snowball hitTests from the grinch that's currently running rather than from the ball - that way you're only testing for one thing being hit, not four (hitTests are pretty slow code).
Hope this helps. Nice idea by the way, wish I'd thought of it for our e-card...