Une solution simple :
\documentclass[a4paper]{article}
\usepackage{newcomputermodern}
\usepackage[nott]{kpfonts-otf}
\begin{document}
En slanted: \textsl{test \textsc{testsc \texttt{testsctt}}}
\end{document}
Pourquoi ça marche ? on charge *d'abord* `newcomputermodern` (en fait `fspdefault.tex`) qui inclut toutes les définitions nécessaires, en particulier celles décrites par @samcarter pour la fonte mono,
et *ensuite* on charge `kpfonts-otf` *sauf* les fontes mono, ce qui redéfinit les polices Serif et Sans et Math.
Un commande brute `\setmonofont{NewCMMono10-Book}` suffirait si la fonte `NewCMMono10-Book` était accompagnée d'un fichier `NewCMMono10-Book.fontspec` qui contiendrait les options adéquates :
\defaultfontfeatures[NewCMMono10-Book]
{
Extension = .otf ,
ItalicFont=NewCMMono10-Italic,
BoldFont=NewCMMono10-Bold,
BoldItalicFont=NewCMMono10-BoldOblique,
SlantedFont=NewCMMono10-Regular,
SlantedFeatures={FakeSlant=0.25},
BoldSlantedFont=NewCMMono10-Bold,
BoldSlantedFeatures={FakeSlant=0.25},
SmallCapsFeatures={Numbers=OldStyle}]{NewCMMono10-Regular}
}
Certaines polices sont accompagnées d'un tel fichier (Erewhon, XCharter, …), d'autres pas comme NewComputerModern, ce qui aboutit à des comportements différents selon les polices.
Rien n'empêche de créer un tel fichier et de le placer dans le répertoire courant (ou dans `$TEXMFHOME` ou `$TEXMFLOCAL` pour un usage global), ensuite l'ECM2 fonctionnera correctement. Cette solution me paraît préférable car elle évite de charger une fois pour rien les polices Serif, Sans et Math de NewComputerModern.NewComputerModern. Ajouter l'option `nott` lors du chargement de `kpfonts-otf` éviterait de charger la police mono deux fois.