That did it. I put your code into a sub select and it works surprisingling fast (about .5 secs for 343 students and over 700,000 StudentSchedule records). I first select all active students (with the inner join to the ClassMaster table). Then for each active student I do the select you suggested to get the 3rd oldest StudentSchedule record and save the ID.
I will just save this record set into a temp table then join and pair down those that have not been in class since the date on the record found.
, ( SELECT MIN(ssID)
FROM ( SELECT TOP 3 ssID = ss2.StudentScheduleID
FROM StudentSchedule ss2
WHERE ss2.StudentID = s.StudentID
ORDER BY StudentScheduleDate DESC
) as temp1
) AS StudentScheduleID
FROM Student s
INNER JOIN StatusMaster sm ON s.StudentStatusID = sm.StatusID
WHERE sm.IsActive = 1