Lo que sucede es que está machacando memoria que no le corresponde , al hacer el new [10] reservas memoria para un char de 10 , y solo le pertenecen 10 posiciones , pero como trabajas con punteros le puedes seguir asignando chars a la cadena , la función
no controla que cad pase del límite , lo único que controla es que el segundo argumento de dicha función tenga la longitud especificada en el tercer argumento , si es mayor no copia los caracteres restantes.
Ejecuta este y veras
#include <stdio.h>
#include <string.h>
int main()
{
char *cad[2];
char *cad2;
cad[0]=new char[10];
cad[1]=new char[10];
//strncpy(cad[0],"",1);
strncat(cad
[0],"789",3); //<-- Crash!!!
printf("%s %s\n",cad
[0] , cad
[1]);
return 0;
}