Your call to rawset() does nothing, since its target is "table", which is a non-existent variable (and also a Lua object type), the variable "index" doesn't exist and is therefore nil, and the value you're trying to set is "button" which, if you actually need to use rawset(), should be the target.
I fixed the scale issue - I was over-thinking it and multiplying when the scale was fractional. This seemed to be the correct method as it worked well in my tests. Now I'm dividing regardless, because increasing my UI scale showed that the multiplication method was incorrect.
As for the secure frames: I see no reason this wouldn't work, though I haven't used them myself. tomQuest2 uses a custom CellProvider, and also supports quest items in the tooltip - your answer may lie there.
After looking at the code for AllPlayed, I did find a bug in LibQTip - :UpdateScrolling() was not taking the scale of the tooltip into account. That has been fixed in r124-release.
I also have a few suggestions:
1: Don't save your anchor frame - pass it every time you draw the tooltip, because some people are weird and run multiple displays with the same feeds.
2: Don't run your own tooltip-hiding OnUpdate(), unless you really like maintaining this on your own. I suggest that you look at the API docs for :SetAutoHideDelay(), which will also properly release the tooltip.
3: Drawing the tooltip in its entirely from an OnUpdate() is insanely wasteful. Instead, keep track of the lines and columns that require the updates and use :SetCell() on them in your OnUpdate(). If you need an example, look at nanoTalk's code.
4: Re-use your tables. You're creating a large amount of throwaway tables and if someone mouses in-and-out of the tooltip you're creating that many every time, making garbage-churn inevitable - especially with your current method of refreshing the values in the tooltip by repeatedly re-drawing it (this is generating roughly 3KiB per second).