As @Tomas-Takac stated, you don't need to use #tmp1 and delete, just do something like
WITH TempEmp (Id,grpid,pass,duplicateRecCount)
AS
(
SELECT Id,grpid,pass,
ROW_NUMBER() OVER(PARTITION by Id,grpid ORDER BY pass) AS duplicateRecCount
FROM #tmp
)
Select Id,grpid,pass from TempEmp WHERE duplicateRecCount = 1
But you said you wanted to use a Join. One way could be to use the contents of your CTE as a sub-query. e.g.
SELECT A.Id, A.grpid, A.pass
FROM #tmp A
INNER JOIN (SELECT Id,grpid,pass,ROW_NUMBER() OVER(PARTITION by Id,grpid ORDER BY pass)
AS duplicateRecCount FROM #tmp)
as B ON B.duplicateRecCount = 1 AND A.Id = B.Id AND A.pass = B.pass