Il problema c'è l'hai perché aggiungi due volte lo stesso puntatore a TagsLoadData quando l'if è true (per altro sovrascrivendo i dati alla seconda chiamata di < GetLoadData > )
codice:
		//se punto B prec. è diverso dal Punto A aggiungo anche B precedente
		if (!bAB && !TagsLoadData.IsEmpty()){ 
			m_pData->m_BeamLoadsIterator->GetLoadData(pLoadData,&LDOld, false, false);
			TagsLoadData.Add(pLoadData); 
		
			bNew = true;
		}
		//aggiungo sempre il punto A
		m_pData->m_BeamLoadsIterator->GetLoadData(pLoadData,&LDTemp, bNew, true);
		TagsLoadData.Add(pLoadData);
Per risolvere basta fare come ho detto prima: lasciare che sia la funzione ad allocare l'oggetto.
codice:
		//se punto B prec. è diverso dal Punto A aggiungo anche B precedente
		if (!bAB && !TagsLoadData.IsEmpty()){ 
			tagLoadData* pLoadData = m_pData->m_BeamLoadsIterator->GetLoadData(&LDOld, false, false);
			TagsLoadData.Add(pLoadData); 
		
			bNew = true;
		}
		//aggiungo sempre il punto A
		tagLoadData* pLoadData= m_pData->m_BeamLoadsIterator->GetLoadData(&LDTemp, bNew, true);
		TagsLoadData.Add(pLoadData);
così ogni puntatore avra una zona di memoria diversa a cui fa riferimento.