Quello è un altro problema. Qui stavi cercando di far passare un quadrato nel buco di un triangolo. Se nel prototipo vuoi ricevere un reference al puntatore, alla chiamata passi solo il puntatore, non l'indirizzo del puntatore.

Detto questo. Se non sai prima deve essere lungo il tuo array C, allora è più indicata una lista (con quello che ne consegue). Non conoscendo container MFC (forse un SafeArray ma vado a spanne), io userei un std::vector.
codice:
bool CSelectionFolder::TreeNodeClick(HTREEITEM* hItem)
{

	std::vector<HTREEITEM*> nodes ;//vector da riempire
	std::vector<CBaseSelectionSection*> pItems ;//vector da riempire
	GetAllChildren(hItem,nodes,pItems);
	
	for (int i=0;i<(2);i++)
	{
		CBaseSelectionSection* pItem =pItems[0];
			
			
	}
	
	
	
	return true;
}

bool CSelectionFolder::CreateListViewItem(CBaseSelectionSection sel)
{	
	
	return true;
}

void CSelectionFolder::GetAllChildren(HTREEITEM* hmyItem,std::vector<HTREEITEM*>& hNodes,std::vector<CBaseSelectionSection*>& TagNodes)
{
	if (m_tree->ItemHasChildren(*hmyItem))
	{
		HTREEITEM* hNextItem; // è un puntatore immagino.
		HTREEITEM* hChildItem = m_tree->GetChildItem(*hmyItem); // anche questo
		while (hChildItem != NULL)
		{
			hNextItem = m_tree->GetNextItem(hChildItem,  TVGN_CHILD );
			hNodes.push_back(hNextItem);
			
			CBaseSelectionSection* pItem = reinterpret_cast<CBaseSelectionSection*>(m_tree->GetItemData(hChildItem));
//			CBaseSelectionSection* pItem =(CBaseSelectionSection*) m_tree->GetItemData(hChildItem);
			TagNodes.push_back(pItem);
			
			hChildItem = hNextItem;
		}
	}
}
Una nota sul cast. Il reinterpret_cast<> è il tipo di cast che più si avvicina al cast stile C, ma sarebbe meglio usarlo solo se uno static_cast fa fallire la compilazione. In caso il puntatore di cui fare il cast sia di una classe polimorfica, è meglio fare un dynamic_cast<> e controllare se il puntatore sia valido. (Cosa che il reinterpret_cast<> non fa.)