ATLのCComPtr::Releaseなのですが
void Release() throw()
{
T* pTemp = p; //*1
if (pTemp)
{
p = NULL;
pTemp->Release();
}
}

こういうコートです。

p->Release();
p = NULL;

じゃだめなのでしょうか?
マルチスレッドに関連したものかなと思ったけど、*1が走る直前に取得したポインタに対して操作を行う可能性を考えたら
あまり意味のあるものではないような気もするのですが。