Thank you. I trust you understand why LOCALs (and PRIVATEs) are so important, I wouldn't want you to think they are needed simply to eliminate warnings from the Cross Reference utility!
The Wikipedia article on Information Hiding explains the importance of limiting the scope of variables.
That's what they call a hostage to fortune! There are still a few shortcomings (some of which you have identified yourself):
The main button array BTTNLIST$(0) is passed into PROC_monitorbuttons as a global rather than as a parameter. Consider the implications of this from the point of view of reusable code: anybody wanting to make use of your routine would be forced to use that specific name for their array whether they wanted to or not!
You pass the result from PROC_monitorbuttons back to the caller in a global variable 'response1$'. That is bad practice. You should instead change the procedure to a function (FN_monitorbuttons) and then you can return the result directly without the use of any globals.
The array 'array$()' is unnecessarily global. As you have found you cannot make it LOCAL because of the way it is created, but you can (and should) make it PRIVATE.