At my last company, we did a similar program, but had to build it out in a regular program with wait steps. With the ability to push someone through the flows anytime, you wouldn't need to worry about the emails not triggering.
For example (flow):
Send email 1
Wait x days
Constraint: if expiry date is not empty, Send email 2
Wait x days
Constraint: if expiry date is not empty, Send email 3
Etc.
This is assuming that your field NULLs out when the lead is no longer nearing an expiration. Might not solve your exact problem, but be something to think on. It worked well for us, but caveat: if you have people in the middle of a program elsewhere, think about how they would enter the middle of the program (since you can't push someone into the middle of a flow).