You seem to have covered the pitfalls of using .data quite well. Rule of thumb, make sure variables needed for gradient computation do not use the .data method. The simplest way to ensure is this is to convert .data and .detach and see if it throws an error. Another way to avoid incorrect gradient computation would be to comment out the .data call and see if the ouputs after few epochs are the same. https://pytorch.org/blog/pytorch-0_4_0-migration-guide/ highlights the problem of using .data with an example.

Are there other dangers of  .data  to be aware of?

None that I know off.