How do you avoid mini waterfalls? At some level of granularity you are doing one thing you committed to at a time. If someone else needs to check it thats a handover.
How I have seen sprints done is you commit to X Y Z, have a definition of done like “is in production” and then developer works on X, gets X code reviewed and so on.
If the aim is that the right amount of work is in each sprint then naturally the last day will be busy trying to get stuff reviewed.