Da geht einiges durcheinander. Deshalb erlaube ich mir, ein wenig weiter auszuholen.
Grundsätzlich werden Dokumentsprachen über ein Sprachpaket umgeschaltet. Die Basisklassen von KOMA-Script überlassen die Sprache komplett einem solchen Paket. Einige KOMA-Script-Pakete und die Briefklasse `scrlttr2` definieren darüber hinaus noch einige zusätzliche, sprachabhängige Begriffe. Außerdem bietet KOMA-Script mit `\newcaptionname`, `\providecaptionname` und `\renewcaptionname` die Möglichkeit, solche Begriffe unabhängig vom verwendeten Sprachpaket komfortabel zu definieren. KOMA-Script-Klassen (und -Pakete) nehmen aber selbst keine Sprachumschaltungen vor.
Optionen, die per optionalem Argument von `\documentclass` angegeben werden, werden von LaTeX selbst auch an die Pakete weitergereicht und sind damit keine reine Klassenoptionen, sondern *globale* Optionen. AFAIR steht das auch in den Abschnitten »Frühe oder späte Optionenwahl« in der KOMA-Script-Anleitung. (Hinweis: Nicht alle Pakete können global angegebene key=value-Optionen verarbeiten. Das betrifft beispielsweise `babel`, das zwar ein global angegebenes `ngerman` versteht, aber eventuell kein global angegebenes `main=ngerman`.)
Die KOMA-Script-Klasse `scrbook` reagiert also selbst nicht auf Option `ngerman`. Einige Pakete (darunter `babel`) reagieren aber darauf. Schon deshalb ist es nicht möglich, die Sprache per `\KOMAoption` umzuschalten. Die Verwendung von `\KOMAoption` und `\KOMAoptions` ist ohnehin nur für key=value-Optionen von KOMA-Script möglich. Auch da ist es für einige Optionen explizit nicht erlaubt (beispielsweise muss `version` immer bereits beim Laden der Klasse angegeben werden). Für veraltete KOMA-Script-Optionen und Kompatibilitätsoptionen ist die Verwendung von `\KOMAoption` und `\KOMAoptions` ebenfalls nicht möglich. Gibt man solche Optionen bei `\documentclass` an, so erhält man eine entsprechende Warnung bzw. Information in der `log`-Datei.
`babel` reagiert auf global angegebene einfache Sprachoptionen wie `ngerman`. Es bietet darüber hinaus Befehle, um auch später noch zwischen *allen geladenen* Sprachen umzuschalten. Dafür, welche Sprachen es lädt, ist entscheidend, welche Sprachoptionen als globale Optionen oder direkt beim Laden von `babel` angegeben sind.
Das Paket `siunitx` wiederum reagiert nicht direkt auf Option `ngerman`. Es regiert aber auf die von einem Sprachpaket eingestellte Sprache, wobei es nur wenige Sprachen von Haus aus unterstützt (siehe Abschnitt »Localisation« in der `siunitx`-Anleitung). Es gibt auch nur wenige Begriffe, die bei `siunitx` wirklich sprachhängig sind. Für deren Änderung sei ggf. auf das von `siunitx` verwendete Paket [`translator`](https://ctan.org/pkg/translator) und dessen Anweisung `\translate` verwiesen.
Über die Sprache stellt `siunitx` aber nur sehr wenig um. Andere Dinge wie das Zahlenformat, die eher in den Bereich der typografischen Gepflogenheiten gehören, werden von Option `locale` bestimmt. Das ist jedoch kein Bug, sondern eine beabsichtige Trennung zwischen Sprache und Typografie. In Abschnitt 7.16 der `siunitx`-Anleitung wird aber auch gezeigt, wie man hier ggf. eine automatische Verknüpfung zwischen der mit `babel` (oder `polyglossia`) eingestellten Sprache und `locale` herstellen kann. Beispielsweise würde
\documentclass[paper=a4]{scrbook}
\documentclass[paper=a4,ngerman]{scrbook}
\usepackage[main=ngerman,english]{babel}
\usepackage{siunitx}
\addto\extrasngerman{\sisetup{locale = DE}}
\addto\extrasenglish{\sisetup{locale = US}}
\begin{document}
Deutsch: \SI{15.3}{\meter}
\SIrange{15.3}{20.4}{\meter}
US-English: \selectlanguage{english}\SI{15.3}{\meter}
\selectlanguage{english}\SIrange{15.3}{20.4}{\meter}
\end{document}
zwei verschiedene Darstellung in Abhängigkeit der Sprache mit sich bringen. Verwendet man dagegen im ganzen Dokument nur eine Darstellung, ist es zweckmäßiger, diese direkt beim Laden des Pakets mit anzugeben:
\documentclass[paper=a4,ngerman]{scrbook}
\usepackage{babel}
\usepackage[locale=DE]{siunitx}
\begin{document}
Deutsch: \SI{15.3}{\meter}
\end{document}
Es sei außerdem noch darauf hingewiesen, dass die Angabe der Sprache bei `\documentclass` ein zweischneidiges Schwert ist. Für viele Pakete funktioniert das. Einige Pakete kennen aber nicht alle Sprache, beispielsweise nur `german` aber kein `ngerman`. Bei denen muss man dann ggf. wieder die passende Option beim Laden angeben. Darüber hinaus, hat `babel` ggf. Probleme bei der Festlegung der Hauptsprache, wenn man Sprachen sowohl bei `\documentclass` als auch beim Laden von `babel` selbst angibt. Im mehrsprachigen Beispiel habe ich daher oben die Hauptsprache sicherheitshalber zusätzlich direkt beim Laden von `babel` angegeben. Paketautoren wird ohnehin empfohlen (wie `siunitx` oder beispielsweise `biblatex`) die zu verwendende Spracheinstellung dem verwendeten Sprachpaket zu überlassen und nicht bereits beim Laden fest vorzugeben. Leider gibt es noch immer Pakete (wie `nomencl`), die dazu nicht in der Lage sind.
sind. `siunitx` verlässt sich bei der Sprachauswahl übrigens auf [`translator`](https://ctan.org/pkg/translator), das die Basis-Sprache ebenfalls per Option benötigt. Auf Sprachumschaltungen mit `babel`'s `\selectlanguage` reagiert es jedoch ebenfalls, wie das erste Beispiel zeigt.
Achja: Im von dir gezeigten Beispiel funktioniert die Sprachumschaltung übrigens einwandfrei. Als Überschrift für das Inhaltsverzeichnis korrekt »Inhaltsverzeichnis« ausgegeben. Wenn das bei dir nicht der Fall ist, dann ist [`babel-ngerman`](https://ctan.org/pkg/babel-ngerman) nicht installiert. Allerdings müsste `babel` dann auch eine entsprechende Meldung ausgeben.