How to optimize this SQL Server query?
First of all, if custId is the Customer's Primary Key, then there's no need to specify DISTINCT at all. Second, grouping and then filtering by the grouped key may be very inefficient when the filtering will likely render a small subset: filter first, then group. Third, I assume you don't require casting to varchar when removing the DISTINCT clause. Fourth, no need to include the alias of every selected field when there's only one table in the selection, it just makes reading the query more cumbersome!

This query can really benefit from indexes on EMailAddr and Phone.

This may perform better, especially if those indexes exist:

SELECT DISTINCT CustId
    , PriceClassID
    , Name
    , S4Future01 as First
    , S4Future02 as Last
    , Addr1
    , Addr2
    , City
    , State
    , Zip
    , Country
    , emailAddr
    , Phone
    , lastorder
    , snotetext
FROM Customer
WHERE 
    EMailAddr IN ( 
        SELECT EmailAddr 
        FROM Customer 
        WHERE EMailAddr IN ( 
            SELECT EMailAddr 
            FROM Customer 
            WHERE EmailAddr &gt; '' AND Crtd_DateTime &gt;= DATEADD(day, -1, CAST(GETDATE() AS DATE))
            ) 
        GROUP BY EmailAddr 
        HAVING COUNT(*) &gt; 1) 
    OR Phone IN ( 
        SELECT Phone 
        FROM Customer 
        WHERE Phone IN ( 
            SELECT Phone 
            FROM Customer 
            WHERE Phone &gt; '' AND Crtd_DateTime &gt;= DATEADD(day, -1, CAST(GETDATE() AS DATE))
            )
        GROUP BY Phone 
        HAVING COUNT(*) &gt; 1) 
ORDER BY EMailAddr
    , Phone ASC
    , Name
    , Last
    , First ASC;