A lot depends on the data distribution, but some things you could explore:
1) Splitting this into 2 so we only join to F when necessary.
Select A.A1, A.A2, B.B1, C.C3,........,NVL(B.B2,B.B3)
From A, B,C,D,E
Where A.A1=B.B5
...
And NVL(B.B2,B.B3) <='01/Jan/2018'
union all
Select A.A1, A.A2, B.B1, C.C3,........,NVL(B.B2,B.B3)
From A, B,C,D,E, F
Where A.A1=B.B5
and b.b2 is null
and b.b3 is null
And F5 <='01/Jan/2018'
Then you can optimize each half of the query in isolation, eg an index ON NVL(B.B2,B.B3) for the top half etc
2) scalar subquery
If you only need 1 (or just a few) elements from F, you could do:
Select A.A1, A.A2, B.B1, C.C3,........,NVL(B.B2,B.B3)
From A, B,C,D,E
Where A.A1=B.B5
...
And ( NVL(B.B2,B.B3) <='01/Jan/2018'
or
( select ... from F where F5 <='01/Jan/2018' )
)