I've fought with this for some time now.
The problem is that the widget API is not MU aware. Everything is based on global variables and each time you switch to a blog you overwrite those globals.
If this is okay, a solution is to grab all the widgets from a particular blog then continue onward. There will be interferences, and widget discrepancies, so I would research more if you intend to to it. I had a half hazard solution a while back using lots and lots of object buffers to grab the widget output before the page output, then put it where it needs to go later in the script.This is really the way widgets need to be done to begin with, but I hate bandaging stuff like this, and would rather start at root of the problem.
Overall, I am quite done debugging this, and would instead like to help in overhauling the widget API.
In your functions file (before the action 'widgets_init' is run)
switch_to_blog(1); // or what ever blog you need
wp_widgets_init();
dynamic_sidebar();
restore_current_blog();
You can simply put the above code in a blog loop, and wrap the iderations in a buffer like I said before. Then reference that output later as variables.
The above works well for MU site footers though. Say, for an MU site with a global footer, you don't need to worry about what things get overwritten by the time the script has reached the footer.