One interesting thing that I'm surprised nobody has mentioned yet is the difference in the types of JIT compilation, because Flash is still JIT compiled, and, in most modern browsers, so is JavaScript, however Flash is a strongly typed language, which means there are a whole realm of optimizations that it can do (such as emitting a call to a method directly (something JavaScript cannot do)), that JavaScript cannot do because it is dynamically typed. You can replace the entire definition of a function in JavaScript at any point you want, and that new definition is what must be called. (it is still possible for JavaScript to do an indirect call that wouldn't be that much more expensive though) Field access on a field is actually a better example than method calling, because JavaScript cannot even do this indirectly, it has to first look the field up by name (hashed) on the current type of the object.
Another difference in performance is, as is already mentioned, the GC. I suspect (I've not checked) that most browsers use either a reference counting GC (because all memory the GC allocated for a page can be freed when the page is left, it's actually one of the best places to use a reference counting GC), or a conservative scanning GC (such as Boehm). The latter can be considerably slower than the former if it's not implemented right. (Boehm is an example of a right implementation) Flash on the other hand uses a precise GC (much easier to do in a strongly typed system). Because Flash uses a precise GC, it doesn't have the runtime overhead of reference counting. (which isn't huge, but is still there) A good example of a precise GC is Mono's SGen, which also compacts the heaps.
Then there comes the fact that JavaScript wasn't designed with animation in mind. (as was also mentioned) As far as I know, no browser will emit SSE-style instructions for the animating loops, where-as the core rendering functions in Flash have probably been hand optimized for peak performance. (in some places being written in raw assembly)
All-in all, it comes down to the fact that a dynamic language will always be slower than a statically typed one if it has to be compiled in a timely manner so as to not make the user complain about it's slowness.