Isso porque o próprio cmdlet não cria no objeto interno [property] para PasswordExpired
. $ _. PasswordExpired é um método, não uma propriedade estática, por isso deve ser chamado quando estiver preenchido. Devido à velocidade (lenta) de grandes consultas (com esse número de propriedades), o -Filter foi implementado para reduzir as chamadas de saída, não da mesma maneira que o pipeline de [propriedade] do objeto.
Então você tem que a) filtrar os objetos à medida que eles se tornam um no pipe (eu recomendaria isso, eu apenas filtraria quase tudo em pipes [filter]) ou b) filtraria a saída de texto (string de seleção).
A maneira "correta" seria a maneira como você fez:
Get-ADUser -Properties * -Filter * | '
# to get the whole object(s), most simple way
# You can make the query faster here, by getting less properties
# -Properties Name,PasswordExpired -Filter *
? { $_.PasswordExpired -eq $false } | '
# here it became an $_.property,
# just filter what you need from the object stream
ft Name,PasswordExpired
# do some output
Na maioria dos casos, eu pessoalmente uso | objeto selecionado FOO | Out-GridView, então nada fica oculto e eu posso classificar / pesquisar o conjunto de resultados depois.