Say the package was on 1.0.0, it subsequently releases 1.0.1, and 1.0.2.
But then realize that 1.0.1 contains breaking changes.
So we need to release a 2.0.0 from 1.0.2 doing an empty commit. No problem there.
Then, we need to make a 1.0.3 release that is actually 1.0.0 so that people on 1.0.x will not be affected by the breaking change.
How to do it using semantic-release?
When managing the version manually, it is simple:
How to do the same using semantic-release?
There is currently no way to do that in an automated fashion. This would be covered once https://github.com/semantic-release/semantic-release/issues/563 is implemented.
Currently the best solution is to do what you described: checkout 1.0.0, manually update the version to 1.0.3, and publish.