I made some modifications to your code in this colab 5.
Things I changed:

[Major-ish] Reparameterize in terms of logits instead of probs – this is (a) generally numerically favorable (internally your probs will be logit-ed anyway) and (b) saves us having to manually normalize to 1 all the time.
[Major-ish] Use tfp.util.TransformedVariable to constrain positive params and vm_loc to lie in [-pi, pi]. This allows us to eliminate the variable clipping.
[Major-ish] Use [0., 0., 1.] as the default value for the deterministic missing data fallback. This prevents a nan log_prob from the Mixture.
[Minor] Use hmm3.trainable_variables instead of variable lists.

With those changes, I see some valid-seeming optimization steps. Please note, though, that I haven’t thought very much about the actual model here – I’m just pattern-matching on common numerical and configuration-style pitfalls. In particular, (1) I have not thought about whether this approach to missing data makes sense in the HMM context (it very well might — I just haven’t thought about it at all!) and (2) one generally wants to be a bit cautious about optimizing on a non-Euclidean manifold, which the VonMises loc is doing (it’s on a circle!) — Amari, 1998 would have us think carefully about metrics and such, and adapt our gradients appropriately. I think the constrained version I wrote here is probably ok as long as the actual optimum is not at -pi/pi, which are effectively “at infinity” in the unconstrained parameter space…If the optimum is there, we can probably just add a phase shift to that angle variable to move it away from infinity.
HTH!