You should be able to do this with a ADO ADSI query:
(&(&(objectCategory=person)(objectClass=user)(!userAccountControl:1.2.840.113556.1.4.803:=2))(|(accountExpires=9223372036854775807)(accountExpires=0)))
will give all the non-disabled accounts that don't expire.
(&(objectCategory=person)(objectClass=user)(!userAccountControl:1.2.840.113556.1.4.803:=2)(accountExpires<=127818648000000000))
will give you all of the non-disabled user objects that expired before 1/16/2006
Here's an example of how to do an ADO ADSI query:
$strbase = "<LDAP://dc=ms,dc=com>"
$strFilter = "(&(objectcategory=user)(useraccountcontrol=66048))"
$strAttributes = "sAMAccountName,displayname"
$strScope = "subtree"
$strQuery = "$strBase;$strFilter;$strAttributes;$strScope"
$objConnection = New-Object -comObject "ADODB.Connection"
$objCommand = New-Object -comObject "ADODB.Command"
$objConnection.Open("Provider=ADsDSOObject;")
$objCommand.ActiveConnection = $objConnection
$objCommand.CommandText = $strQuery
$objRecordSet = $objCommand.Execute()
And according to this post... you'll get the answer much quicker this way then you would with a cmdlet. Also here is a great guide to ADO ADSI, it's references VBscript examples, but you can easily translate the concepts back to Powershell.