Você precisa colocar a verificação do usuário na junção, não na condição where, assim:
SELECT c.course_id,l.topic,l.id,l.vid_duration,p.*
FROM courses c
LEFT JOIN lessons l ON l.course_id=c.course_id
LEFT JOIN progress p ON l.id = p.lesson_id and p.user_id = :userid
WHERE c.slug = :course
A razão para fazer isso é que JOINS usa a "junção esquerda" (que é implicitamente uma junção externa". condição não funcionar, ele retornará todos os dados das tabelas mencionadas anteriormente, mas para a tabela mencionada na linha, retornará NULLS para todas essas colunas.
Peço desculpas por essa descrição, pois é difícil colocar em palavras exatamente como uma junção externa (ou esquerda) complexa funciona sem ser prolixo.