You need brackets around your OR'd conditions (and should use JOIN notation):
SELECT DISTINCT
a.AssignedEmp,
COUNT( a.TipoStatus ) AS 'Service Request Count'
FROM Service AS a
JOIN employee AS b ON a.AssignedEmp = b.UserName
WHERE b.Classification_ClassificationID = 2
AND (a.TipoStatus = 'Open'
OR a.TipoStatus = 'Pending'
OR a.TipoStatus = 'Hold'
OR a.TipoStatus = 'Warranty')
GROUP BY a.AssignedEmp
LIMIT 0, 30
Or you can write the condition directly in terms of 'not closed':
SELECT DISTINCT
a.AssignedEmp,
COUNT( a.TipoStatus ) AS 'Service Request Count'
FROM Service AS a
JOIN employee AS b ON a.AssignedEmp = b.UserName
WHERE b.Classification_ClassificationID = 2
AND a.TipoStatus != 'Closed'
GROUP BY a.AssignedEmp
LIMIT 0, 30
As originally written, the WHERE clause was equivalent to:
WHERE (b.Classification_ClassificationID = 2 AND a.TipoStatus = 'Open')
OR a.TipoStatus = 'Pending'
OR a.TipoStatus = 'Hold'
OR (a.TipoStatus = 'Warranty' AND a.AssignedEmp = b.UserName)
This counts all the Open service items that have a classification ID of 2 for the user; it also counts all the Pending service items regardless of classification ID, and all the Hold service items regardless of classification ID, and all the Warranty service items assigned to the user, regardless of classification ID. The GROUP BY filters things so that only the items with the right assigned employee are counted, but there is a partial cross-product for some of the terms, leading to the inflated counts.
LIMIT. And don't call me "Shirley" :p