I've spent way too long getting this right. It seems so simple to just have a letter appear every fraction of a second in a text block... and it is. At least until you start caring about details like line wrapping not breaking mid-effect and rich text support.
I've posted the relevant code to get this all working on github. The code will not work out of the box - it relies on some classes that I have not included (related to the dialogue system it was pulled from - they're very easy to swap out though) and needs some setup in UMG. It also isn't super optimized and there are some limitations, but it's something I'll improve on in the future.
Check out the readme for a more extensive explanation of the problems that this solves, and feel free to file issues on it if you find any problems with it.