すみません、置き換えをした後で置き換え前の文字列が欲しいという意味ではなくて、
そもそも置き換えをするためのベースの文字列が欲しいということです。

それともうひとつすみません、勘違いしていました。
今手元の環境でテストしてみたところ、
CCmdUI::m_pMenu が NULL になるのはメニューがクリックされた時に呼ばれる場合で、
メニューが表示される前に呼ばれる場合はちゃんと値が入っていました。
そこで

void CMenuTestApp::OnUpdateEditTest(CCmdUI* pCmdUI)
{
  if(pCmdUI->m_pMenu)
  {
    CString str;
    pCmdUI->m_pMenu->GetMenuString(pCmdUI->m_nID, str, 0);
    str.Replace(_T("%1"), _T("ファイルA"));
    pCmdUI->SetText(str.GetString());
  }
}

のようにしたらうまくいきました。
お騒がせしました。