Você está correto, na especificação do esquema, não pode. você teria que desnormalizar a tabela Course_Fee, de modo que ela também aparecesse na tabela Student_course (já que essa é a única tabela que mapeia 1-para-1 com o fenoma de um aluno específico tendo uma classe específica).
Existe uma alternativa no entanto. Imagine na tabela de cursos que você tinha duas linhas como:
...
2,'Intro to CS', '15 weeks', 2000.00
...
5,'Intro to CS', '15 weeks', 2500.00
...
agora você pode ter registros históricos de alunos fazendo uma versão anterior do curso para 2000 $ empatados com ID = 2, e novos alunos assumindo a nova versão com 2500 $ empatados com ID = 5.
A expressão de esquema, como suas definições de tabela, não informa tudo sobre como um banco de dados funciona. Mesmo depois de considerar campos, chaves, restrições, etc, ainda há a maneira como o aplicativo usa a tabela a ser considerada. Por exemplo, neste caso, o aplicativo pressupõe que haja cursos duplicados e use o Top (1) em suas consultas:
select Top(1) * from Course order by ID DESC
Então, pode expressar isso? sim. É um projeto ruim, sim. Melhor desnormalizar e, melhor ainda, criar uma tabela de taxas de curso com um bit ativo, para que você possa desativar as taxas antigas, mas ainda manter os dados e a integridade referencial.
Eu faria como:
Student(Id, Name)
Fee(Id, Fee)
Course(Id, course_name , course_duration , FeeId)
StudentCourse(StudentId, CourseId, FeeId)