WHEN MATCHED clause fails if there's a NULL in the ON columns
The predicate for MATCH doesn't fail, it behaves exactly like it is supposed to. NULL is not a value, NULL is a state that indicates there is no value. 
Therefore, any predicate with any comparison to NULL will resolve to 'UNKNOWN' and not to 'TRUE', causing the row to be considered as a non-match.
To deal with that, you will need to decide on the logic and how you would like to evaluate the rows in case you have NULLs. 
For example, if It is only for last name, and you want to consider it a match, you may solve it by extending the predicate to handle the NULL:

MERGE PEPS AS peps
USING (Lots of Cols..
       FROM PEPS_temp) 
AS temp (Lots of Cols..) 
ON peps.[Name] = temp.[Name] AND 
   (peps.[LastName] = temp.[LastName] OR peps.LastName IS NULL) AND 
   peps.[TypeEntity] = temp.[TypeEntity] AND
   peps.[Source] = temp.[Source]
WHEN MATCHED THEN
UPDATE SET peps.[Category] = temp.[Category] 
WHEN NOT MATCHED THEN
INSERT (Lots of Cols..) VALUES (temp.[Col], temp.[Col], temp[Col]....)