条件のような場所ではなく、参加にユーザーチェックを入れる必要があります:
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
これを行う理由は、JOINSが「左結合」(暗黙的に外部結合)を使用するためです。このタイプの結合は、条件が機能する場合、その行のそのテーブルのすべての列データを返すことを意味します。条件は機能せず、前述のテーブルのすべてのデータを返しますが、行に記載されているテーブルの場合、それらすべての列に対してNULLを返します。
複雑な外側(または左)の結合がどのように機能するかを正確に言葉で表現するのは難しいので、その説明をお詫びします。