Your conclusion is correct: when marking up a language in HTML, you cannot specify the contents of an element as in a language other than its attribute values, since the lang attribute sets both of them. And the workaround is the one you found: use the internal markup for the content. There is no difference between HTML 4 and HTML5.
However, this is a very theoretical problem.
Firstly, abbr markup is practically useless in practice. Abbreviations should be explained, when necessary, in plain text content, not in attributes. Speech browsers can optionally read the values of the title attributes, but in normal mode they ignore them - people who use speech browsers prefer fast reading and are often used to fairly high speech speeds, and the wording of the abbreviations will violate this.
Secondly, “abbreviations,” such as “HTML” (which is really the correct name, not anything else), rarely need to be spelled out in speech. You would not want to hear a speech like "The new version of the HyperText markup language is HyperText five markup language, which has many extensions for the hypertext markup language four."
Thirdly, language markup is mainly intended for writing. In most situations, this is simply ignored. Google doesn't care. Browsers can use it to determine the default font to be used, but most pages set their own fonts, so the default values do not matter. Some speech browsers can recognize several languages from the lang attributes, but most of them are not: they read content according to the rules for the language selected by the user. Those who use language markup can make a distinction between English and American English, so if you still think that language markup matters, consider using lang="en-GB" in this context. (I assume that most people who speak Swedish will find the resulting pronunciation more understandable and natural than Standard American, but I could be wrong.)
source share