@BenDonahue
Yes, I know that a lot of forum responses are "drive-by", shoot and go. I do try to emphasize best practices and strategies (as I see a lot that are just bad off the bat). I want people to adopt this platform and grow it. If there is a lot of misunderstanding and frustration, people will give up on it and consider it not working.
So, to go down your list.
You're actually causing performance problems by collecting colChartQGroup and colQuestions in your OnStart. PowerApps retrieves information from the Datasource only when it doesn't have it. So, if you reference the datasource directly rather than a collection, PowerApps will get the data as it needs it. If you put in a collection to get it all, then you are forcing PowerApps to get all the data at once. This is a hit on start up.
A DataSource is not a lot different from a Collection, except that it "ties" to the session tables (the ones that get created when you start the app in the cloud). So, the session table is a copy of the real datasource (up to record limit). The datasource is a blank table with the schema of the real data. It gets filled on-demand. Eventually, if all records are requested, then it is a duplicate of the data in the session table and the real data source.
If you add a collection, you are just causing the app to have to forcefully get all the data again and then duplicate it YET another time.
Also, a collection is a special type of Table. It is just a table but it has the ability to add or remove rows to it. If you don't need to do that (as in the case of your Static data) then skip the collection and just assign to a variable (again, if for some reason you need to force a fill of ALL of the data rather than on-demand).
As for varRecord, this is acceptable use of a variable, but it is a snapshot at that time. The gallery has a .Selected property which is the record that is selected...ThisItem You can rely on the .Selected as long as your Items property of the Gallery is not complex (this is another story on Items property and the .Selected that I will skip for the moment).
I'm not exactly following where you are setting the varQGroupRecord from what you showed, but I assume it is getting you what you need.
As for saving, your save should be based off of the Gallery that has the questions in it. The Items of that Gallery should be based on a filter of the datasource for the questions you want to display based on the first Gallery selected record and the question group.
Once that is in place, then your save is essentially (not verbatim):
Patch(yourDataSource, ForAll(Filter(yourGallery.AllItems, !IsBlank(answer.Text)) As _item, Patch(_item, {answerColumn: _item.answer.Text})))
So, if your question/answer gallery is only comprised of the questions in need, then the record update/patch will occur just on them.
Speaking of best practices - Keep in mind that a ForAll is not a For/Loop, it is a function that returns a table. I see WAY too often that people look at it as a programming for/loop, and performance suffers.