Your trigger looks too complex to perform well under load.
In this case it looks as though it can be made set based.
An alternative would be to make the processing asynchronous either by using Service Broker or by rolling your own queue.
(Google if you are interested.)
Try something like the following:
ALTER TRIGGER [Event].[trUpdateActivityStatusAfterUpdate]
ON [Event].[ServiceAreaActivityProcess]
AFTER UPDATE
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
IF (SELECT TRIGGER_NESTLEVEL() ) > 1
RETURN;
DECLARE @CurrentDate date = CURRENT_TIMESTAMP;
WITH AStatii
AS
(
SELECT [CURRENT],[ODUENCOMP],[COMPLETE],[ODUECOMP],[EXTCOMP]
FROM
(
SELECT ActivityStatusId, ActivityStatusCode
FROM #ActivityStatus
) S
PIVOT
(
MAX(ActivityStatusId)
FOR ActivityStatusCode IN ([CURRENT],[ODUENCOMP],[COMPLETE],[ODUECOMP],[EXTCOMP])
) P
)
UPDATE P
SET ActivityStatusId =
CASE
WHEN P.CompletionDate IS NOT NULL
AND P.ExtDueDate IS NOT NULL
AND P.CompletionDate <= P.ExtDueDate
THEN S.EXTCOMP
WHEN P.CompletionDate IS NOT NULL
AND P.CompletionDate <= P.DueDate
THEN S.COMPLETE
WHEN P.CompletionDate IS NOT NULL
THEN S.ODUECOMP
WHEN P.ExtDueDate IS NOT NULL
AND P.ExtDueDate <= @CurrentDate
THEN S.[CURRENT]
WHEN P.ExtDueDate IS NOT NULL
THEN S.ODUENCOMP
ELSE P.ActivityStatusId
END
FROM [Event].[ServiceAreaActivityProcess] P
CROSS JOIN AStatii S
WHERE EXISTS
(
SELECT 1
FROM inserted I
-- Assuming ServiceAreaActivityProcessId is the PK of [Event].[ServiceAreaActivityProcess]
WHERE I.ServiceAreaActivityProcessId = P.ServiceAreaActivityProcessId
);
END