Constant hazards mean that survival times are exponentially distributed. It's possible, in the case of $X=1$ to simulate first whether your exponential time is greater than $\tau$ and then generate what that time will be according to the correct distribution (and, of course, memorylessness).
For an exponential RV $T \sim \mbox{Exp}(\beta_0)$ the probability that $T$ is greater than $\tau$ is just $\exp(-\theta\tau)$. If you compute the indicator of whether this exceeds that value, you can generate the actual value of $T$ using that $Pr(t \leq T | t \geq \tau) = 1-\exp( \left(t-\tau \right)\left(\theta + \Delta \right) )$
In R it looks like this:
n <- 100 ## set sample size
x <- rbinom(n, 1, 1/3) ## generate exposure
tau <- 1 ## set cut off for rate change point
theta <- 0.8 ## baseline rate
delta <- 0.3 ## rate difference after change point
eta <- 2 ## censoring rate
t <- numeric(n) ## init failure times
t[x==0] <- rexp(sum(x==0), theta) ## generate unconditional failure times for unexposed
i <- rbinom(sum(x==1), 1, exp(-tau*theta)) ## generate indicator for change point
t[x==1] <- rexp(sum(x==1), theta + delta*i) + i*tau ## generate conditional failure times
r <- rexp(n, eta)
eventtm <- ifelse(t < r, t, r)
outcome <- ifelse(t < r, 1, 0)
coxph(Surv(eventtm, outcome) ~ x)