I would also split it up.
for Z_{observed} == \tau*, I use a Poisson likelihood directly:
with model:
lambda_ = pm.Deterministic("lambda", f(theta, x_predictor))
pm.Poisson("observed_tau",
lambda_[Z_observed == tau],
observed=np.zeros_like(Z_observed[Z_observed == tau]))
for the rest, I would skip the Poisson latent altogether:
with model:
pm.Normal("observed_rest",
mu=beta0 + beta1 * tt.log(lambda_[Z_observed ~= tau]),
sigma=sigma_obs,
observed=Z_observed[Z_observed ~= tau])