In linea generale, il typedef serve per astrarre il tipo di dato in modo da poterlo usare senza sapere cosa esso sia.

Supponi di creare una classe che faccia uso pesantemente di un container, ad esempio vector<int>. Inizi ad usarlo un pò dappertutto nella classe, poi ad un certo momento ti accorgi che per ragioni di perfomance o altro è meglio usare una deque<int> o una list<int>.

I casi sono due: o ti rileggi tutto il codice e cambi manuamente il container, oppure all'inizio scrivi.
codice:
   typedef std::vector<int> Contenitore;
// typedef std::deque<int> Contenitore;
// typedef std::list<int> Contenitore;
E usi il nuovo alias come nome di variabile, senza cambiare in seguito una singola linea di codice.
Se ti serve un container diverso, basta commentare la prima linea e decommentare una delle seguenti.

Serve anche per abbreviare le definizioni.
Da tuo codice:
codice:
typedef CArray<int, int> CArr_int;
bool CSapBase::ImportSelectionGroup(CString* strGroup, CArr_int* pArrJoint, CArr_int* pArrBeam, CArr_int* pArrShell)
...etc..