To implement this functionality,
router.navigate
Followed by
location.replaceState
Using the same path will allow you to make changes and update the history simultaneously.
For instance, in your scenario:
this.router.navigate(['questions/1']);
this.location.replaceState('questions/1');
If you want to include parameters in the route, generate the URL for the location by following this method:
router.serializeUrl(router.createUrlTree(/* parameters from your router.navigate */));
For the example provided:
this.router.navigate(['questions/1', {name:"test"}]);
this.location.replaceState(this.router.serializeUrl(this.router.createUrlTree(['questions/1', {name:"test"}])));
Update
The angular router now includes a replace URL option. In your case:
this.router.navigate(["questions/1"], {replaceUrl:true});
Update 2
There is a current problem where multiple navigations in a short time frame may not replace the URL correctly. As a temporary solution, delay the navigate function using a timeout for separate execution cycles:
setTimeout(()=>{
this.router.navigate(["questions/1"], {replaceUrl:true});
});