Okay here is what is going on.
When the calculator reaches Prompt mat1 in the code, it asks you for a value to store to the variable mat1. You enter q, so it takes the value of the matrix q, and stores it to a new matrix called mat1. Then readmat("mat1"), due to the indirection tricks we used, inputs values to store into mat1. The matrix q never gets modified.
If you want to modify a variable outside the program, you'll need the name of the variable, as opposed to the value of the variable, and Prompt won't help you with that. You want to read a string (variable names are strings), so use InputStr. In this case, you'd replace Prompt mat1 with InputStr name1. I use a variable called name1 to emphasize that we're not dealing with a matrix here, but the name of a matrix variable.
Then, since we already have a variable name, we can call readmat(name1) with no additional quotes necessary. If you run this program and enter q when prompted, name1 will be equal to "q", and readmat(name1) will be readmat("q"), and read entries into the variable q.
As for the rest of matradd(): change the part for the second matrix in the same way. For the last part, to get at the values of the matrices whose names we have, we'll need to use # again:
Disp #name1, #name2
Disp "+", "="
If you ever end up learning a real programming language (such as C) you'll learn about pointers. With the # command, variable names are like pointers in TI-Basic, except real pointers use memory addresses instead. Probably best not to worry about this too much for now.