島野です。

> とりあえずの回避方法としてはスタック変数を指定すれば落ちなくなるので、
> それで対応しようと思いますが、何故落ちるのかが分かりません。

とりあえず原因は、わかりました。
Dr.ワトソンで、コールスタックを吐き出したら、
AddString() 関数が呼び出している、CharUpperBuff() API あたりで、
コケているようです。
試しに、以下のようなテストコードを書いてみたら、やはり同じ場所で、
落ちました。(文字リテラルを渡すのがマズイようです)
# って、やっぱり M$ のバグっぽい気がするんですけど・・・(^^;;;

<テストプログラム>
-----------------------------------------------------------------------------
int SetData( LPCTSTR lpszData )
{
    try
    {
        TRACE2( "lpszData = [%s](0x%08X)\n", lpszData, lpszData );
        CharUpperBuff( (LPTSTR)lpszData, lstrlen(lpszData) );
        //             ^^^^^^^^^^^^^^^^ 読み取り専用メモリを書き換えている!?
        TRACE2( "lpszData = [%s](0x%08X)\n", lpszData, lpszData );
    }
    catch( ... )
    {
        TRACE0( "Abnormal termination.\n" );
    }
    return 0;
}

int test()
{
    TCHAR szData[]          = _T("aaa");
    static TCHAR s_szData[] = _T("bbb");
    CString strData         = _T("ccc");
    LPCTSTR p               = _T("ddd");
//  SetData( szData );    // 落ちない
//  SetData( s_szData );  // 落ちない
//  SetData( strData );   // 落ちない
//  SetData( p );         // 落ちる
//  SetData( _T("eee") ); // 落ちる

    return 0;
}

void CTestDlg::OnButton1() 
{
//  m_cbTest.AddString( _T("aaa") );        // 落ちる
//  m_cbTest.InsertString( 0, _T("aaa") );  // 落ちる
//  m_cbTest.SetWindowText( _T("aaa") );    // 落ちない
    test();                                 // 落ちる
}

-----------------------------------------------------------------------------

ということで、とりあえず原因は、わかったのですが、良い回避方法が思いつきません。
今のところ、
-----------------------------------------------------------------------------
1. 人海戦術で 文字リテラル _T("") を (CString)_T("") のように置換する
2. 「1.」をマクロで置換する。
3. SetData() のような関数を用意し、その中で CString に変換する。
-----------------------------------------------------------------------------
と言った方法を考えているのですが、他に何か良い案などありませんでしょうか?

--