Der Unterschied ist, $ablaufdatum ist ein String $datum ist aber ein DateTime Objekt.
$datum = GetDate -Format $datum
sieht auch nicht so aus als wäre $datum vorher definiert
$datum = (Get-Date -Format 'dd.MM.yyyy').ToString()
oder
$datum = (Get-Date).ToString("yyyy.MM.dd")
dann funktioniert das mit Substring
$datum = Get-date -Format $datum
$datum = $datum.Substring(0,10)
echo $datum
wirft bei mir den gleichen Fehler für substring und das echo liefert dann "Freitag, 29. März 2019 09:59:13"
zum Thema Ablaufdatum noch: Du kannst dir den Umweg über "net user ..." sparen
$ablaufdatum = (Get-AdUser <accountName> -Properties AccountExpirationDate |select -expand AccountExpirationDate).ToString('dd.MM.yyyy')