I found a solution to this problem. I will share the most helpful (and simple) portion of the solution in case anyone is interested. I am dynamically loading user controls into two different UpdatePanels, so the ScriptManager was vital in accomplishing what I needed to.

Code:
protected void ScriptManager_Navigate(object sender, HistoryEventArgs e)
        {
            string menuSection = e.State["MenuSection"];
            string contentSection = e.State["ContentSection"];

            if (String.IsNullOrEmpty(menuSection))
                RedirectControl(phMenuPlaceHolder, "~/Controls/Menu/Menu1.ascx");
            else
                RedirectControl(phMenuPlaceHolder, "~/Controls/Menu/" + menuSection + ".ascx");

            if (String.IsNullOrEmpty(contentSection))
                RedirectControl(phContentPlaceHolder, "~/Controls/Content/Content1.ascx");
            else
                RedirectControl(phContentPlaceHolder, "~/Controls/Content/" + contentSection + ".ascx");
        }
Basically, on the ScriptManager's Navigate event, I've checked to see if the URL hash contains information about which MenuSection and / or ContentSection is currently presented to the users (MenuSection and ContentSection represent two different PlaceHolders within two different UpdatePanels). Based upon the information that is available in the URL hash, I call a custom RedirectControl method with different arguments.

The other side of this is creating a browser history entry when actions are performed within the UpdatePanels (in order to allow a user to use his or her browser's forward and back buttons). I've accomplished this with the following code:

Code:
private void LoadUserControls()
        {
            string controlPath = CurrentMenuControl;
            if (!string.IsNullOrEmpty(controlPath))
            {
                phMenuPlaceHolder.Controls.Clear();
                UserControl uc = (UserControl)LoadControl(controlPath);
                uc.ID = Path.GetFileName(controlPath).Replace(".ascx", "");
                phMenuPlaceHolder.Controls.Add(uc);

                if (smScriptManager.IsInAsyncPostBack && !smScriptManager.IsNavigating)
                    smScriptManager.AddHistoryPoint("MenuSection",uc.ID);
            }

            controlPath = CurrentContentControl;
            if (!string.IsNullOrEmpty(controlPath))
            {
                phContentPlaceHolder.Controls.Clear();
                UserControl uc = (UserControl)LoadControl(controlPath);
                uc.ID = Path.GetFileName(controlPath).Replace(".ascx", "");
                phContentPlaceHolder.Controls.Add(uc);

                if (smScriptManager.IsInAsyncPostBack && !smScriptManager.IsNavigating)
                    smScriptManager.AddHistoryPoint("ContentSection", uc.ID);
            }
        }
In my LoadUserControls method, which is called from RedirectControl, I check to ensure an asynchronous postback has occurred and that the user has not forced a navigation (via the back button, for instance). If this is the case, I add a new index to the user's browser history containing keys for the current MenuSection and ContentSection respectively.

This allows for full browser history functionality and the ability to navigate to specific states in my AJAX Web application. For instance, the default page URL with MenuSection "Menu2" and ContentSection "Content1" displayed would be as follows:

Code:
http://localhost/Default.aspx#&&ContentSection=Content1&MenuSection=Menu2
**Note** Current procedures for user control ID assignment are a bit rough and could lead to problems if the filenames of the user controls being loaded in the MenuSection and ContentSection match, but that wasn't the point of this test app.

Helpful resources:
http://www.asp.net/learn/3.5-SP1/video-242.aspx (implementing AJAX history)
http://geekswithblogs.net/rashid/arc...datePanel.aspx (dynamically loading user controls)