Injecting the ads directly would make them skippable. Unskippable ads are inherently detectable (because the unskippability has to be communicated to the client-side player controls), so there’s no easy way out.
--
[1] They do send a super low resolution stream with no audio, but not the actual quality you are watching in.
[2] Right now Twitch does not stop sending content in markets where they don't have ad inventory. So there are actually browser extensions already that will use a custom foreign market server to proxy the video during ad breaks, so that you can still have an 100% effective ad blocker.
Anything that JS on the client can do is also under control of browser extensions. We are talking about YouTube’s options under that constraint.
The only other alternative is to make the video a live stream of indefinite length where the user can’t skip forward beyond the farthest point they already played.