If I understand what you want, then try
;With cteDRank As
(SELECT DISTINCT convert(varchar, b.bookindt, 101) as [book-in date],
b.bookinno as [book-in no.],
dbo.fn_getoffensedesc(o.offenseid, o.probviolation,(select offense from trdcode61 where code61id = o.code61id) , o.goc) as offensedescription ,
o.PrimaryOffense AS [Primary Offense],
trd.l_d as [offense l/d],
p.firstname as [first name],
p.lastname as [last name],
Dense_Rank() Over(Partition By bookinno Order By Left(trd.l_d, 1)) As DRank
from tblpeople p
left outer join tbloffense o (nolock) on o.personid=p.personid
left outer join tblbookin b (nolock) on b.bookinid=o.bookinid
left outer join trdcode61 trd (nolock) on trd.code61id=o.code61id
where
dbo.fn_isinjailbybookinid(b.bookinid) = 1
--AND
--b.bookinno='21042173'
AND
(trd.l_d like 'F%' or trd.l_d like 'M%')),
cteMaxRank As
(Select [book-in date],
[book-in no.],
offensedescription ,
[Primary Offense],
[offense l/d],
[first name],
[last name],
Max(DRank) Over(Partition By [book-in no.]) As MRank
From cteDRank)
Select [book-in date],
[book-in no.],
offensedescription ,
[Primary Offense],
[offense l/d],
[first name],
[last name]
From cteMaxRank
Where MRank = 2 -- There was both at least one row with M% and at least one row with F% for this book-in no.
order by
[first name],
[last name]
Tom