Libnds sólo te abstrae el hardware y te evitas conocer la mayor parte de las direcciones de los registros,etc pero no que hacen (puedes usarla sin conocer el hardware pero luego vienen los lloros). Pa_lib en cambio "escode" aun más el hardware y su configuración y te permite programar sabiendo "sólo" lo que la DS te ofrece. Y lo de que está montada sobre libnds es hasta cierto punto cierto, partes si, partes no.
Si sólo quieres programar en la DS usa Pa_lib. Si además quieres aprender a programar para consolas (libnds no es tan diferente del sdk oficial) y profundizar más en el tema, libnds es mejor opción. Es cuestión de necesidades y preferencias.