NULL ya se ignora, por lo que puede usar NULLIF convertir 0 a NULL . Además, no necesita DISTINCT y tu WHERE en ActualTime no es sargable.
SELECT AVG(cast(NULLIF(a.SecurityW, 0) AS BIGINT)) AS Average1,
AVG(cast(NULLIF(a.TransferW, 0) AS BIGINT)) AS Average2,
AVG(cast(NULLIF(a.StaffW, 0) AS BIGINT)) AS Average3
FROM Table1 a
WHERE a.ActualTime >= '20130401'
AND a.ActualTime < '20130501'
PD:no tengo idea de qué Table2 b está en la consulta original porque no hay una condición de unión para ello, así que lo omití de mi respuesta.