It is possible to make the final render almost as fast as the viewport render, but you might not want to. The viewport render sacrifices a lot of features in order to make it update quickly. Firstly, it uses Direct Illumination only, which means that it basically only ever calculates 2 bounces. It also has a lot to do with whatever modifiers you're using. If you have a subsurf modifier that is set to 1 subdivisions for view and 4 subdivisions for render, then your final render has to deal with x^4 more polygons than the viewport does, which is obviously going to take longer.
There's also a little overhead in writing the frame to a file and then loading the next frame to start rendering, which the viewport doesn't have to do.
Lastly, the BVH acceleration structure (selected in the render settings) can make a critical difference in render speeds. IIRC, the viewport ONLY uses Dynamic BVH which spends a lot less time calculating the BVH (because things might move around), but each sample takes longer.
Details:
There are two parts to the render: setup and sampling. The right setup can make sampling faster, but if you have to do some complicated setup for every frame, that might actually take longer than the time you save on sampling. The part of the setup that matters is the Acceleration Structure, called a Bounding Volume Hierarchy (BVH). This is basically a way of organizing things so that they're easy to find. You can either have a Static BVH or a Dynamic BVH. A Static BVH takes longer to build, but makes sampling more efficient. The Dynamic BVH doesn't take as long to build, but it doesn't make sampling quite as efficient as Static. The other important difference is that with a Static BVH, nothing can move*. If anything moves, it has to be totally rebuilt. Whereas with a Dynamic BVH, if something moves from one frame to the next, the BVH can be updated much more quickly than with a Static BVH.
IIRC, there are also some features that aren't rendered at all for the viewport. I want to say that SSS, AO, and caustics aren't (or weren't) calculated at all for the viewport render. But I'm not sure what they are.
*To be honest, I'm not quite sure what "nothing can move" means, I just get this from the tooltip. You'd do well to do some research or experimentation. It's possible that a Static BVH can be reused even if objects translate, so long as the mesh doesn't deform. It's also possible that any change of any object from one frame to the next requires a complete Static BVH rebuild. I'm not sure.
I hope that helps!