Thanks Martin. I managed to get around this issue (as I didn't want the ScriptManager control on the live site because of the additional payload) by doing the following:
On master (I needed to have the outer placeholder "plcManagers"):
<asp:PlaceHolder runat="server" ID="plcManagers">
  <cms:CMSPageManager ID="cmsPageManager" runat="server" EnableViewState="false" />
  <asp:PlaceHolder runat="server" ID="phScriptManager" />
</asp:PlaceHolder>
On a template code-behind:
private void CreateScriptManager()
{
  if (CMSContext.ViewMode == ViewModeEnum.Edit)
  {
    var script = new ScriptManager();
    script.ID = "ScriptManager1";
    this.FindControl("Form").FindControl("plcManagers").FindControl("phScriptManager").Controls.Add(script);
  }
}
That way, only the "Page" tab in the CMS uses this functionality, keeping the public facing side of it lighter in terms of payload size.