Maybe this is a simpler solution:
SELECT *
FROM dbo.Candidate AS c
WHERE c.candidate_id NOT IN(
SELECT c.candidate_id
FROM dbo.Candidate AS c
CROSS JOIN dbo.Skill AS s
LEFT JOIN dbo.CandidateSkills AS cs ON c.candidate_id = cs.candidate_id AND s.skill_id = cs.skill_id
WHERE cs.candidate_id IS NULL);
It could be used with an additional condition to get specific skills
SELECT *
FROM dbo.Candidate AS c
WHERE NOT EXISTS(
SELECT 1
FROM dbo.Candidate AS ci
CROSS JOIN dbo.Skill AS s
LEFT JOIN dbo.CandidateSkills AS cs ON ci.candidate_id = cs.candidate_id AND s.skill_id = cs.skill_id
WHERE cs.candidate_id IS NULL
AND ci.candidate_id = c.candidate_id
AND s.skill_id IN(1,2,4)); --This could use a multiple valued parameter from SSRS