Also nochmal zu ersten Beispiel, obwohl das bereits erklärt wurde: es wird deswegen keine Exception gefangen, weil keine geworfen wird. Und geworfen wird keine, weil nirgends Code steht der eine werfen würde. Wie viel einfacher kann man es noch formulieren?
Dass du einen Nullpointer dereferenzierst ist ein Programmierfehler, aber wenn du dir erwartest dass bei jedem Programmierfehler irgendwo irgendwie eine Exception geworfen würde hast du Exceptions nicht verstanden.
In dem speziellen Fall "Nullpointer dereferenzieren" gibt es zwar z.B. unter Windows eine Möglichkeit wie man zu seiner Exception kommt (-> _set_se_translator), aber das hat mit dem C++ Standard rein garnichts zu tun. Hier geht es um SEH (Structured Exception Handling), da steckt zwar auch das Wort Exception drinnen, hat aber trotzdem mit C++ Exceptions nicht viel zu tun.
Zum 2. Beispiel: das kann 101 Gründe haben wieso du da keine Fehler bekommst. Das hat aber weder mit DLLs noch mit C++ Exceptions zu tun. Ich denke da wirst du dir wohl die Klasse "Msxml2.DOMDocument.4.0" angucken müssen, ggf. ist das einfach "by design". Probier doch einfach mal ein vorhandenes XML Dokument zu laden, und das dann auf z.B. "Z:\\xxx\\foo.xml" zu speicher, vorausgesetzt den Ordner gibt es bei dir nicht. Oder speicher es in einen Ordner auf den du dir vorher selbst Schreibrechte wegnimmst.
Ansonsten lies die Doku zu der COM Klasse, da muss eigentlich drinnen stehen wann eine Operation einen "failed" zurückliefert und wann "success".
Kurz: du hast hier kein grundsätzliches Problem mit Exceptions oder DLLs, sondern 2 verschiedene "Probleme", die bloss beide dazu führen dass keine Exception geworfen wird wo du dir eine erwartest.