Is it a good idea to add a reserved field to a large MySQL table? As you may know adding a new column to a MySQL table with millions of records is  hard and in some cases impossible. 

Is it a good idea to add a text column to each table (say, meta) to save some headache in future? Of course, they are empty in most cases.

These data can be stored as JSON. I know this field can not be accessible easily but it can avoid another join and it's important for this performance-sensitive app. 

It uses InnoDB.
I echo the "bad form" comment of @JohnM - design the thing properly, and if you have new requirements (or your design isn't perfect first time - unlikely I know :-) ), then choose to add new fields. Use JSON if it suits your clearly demonstrated requirements, otherwise stick with "normal" field types. 

I've seen too many systems where these "spare fields" get used for anything and everything and it ultimately becomes an undocumented, alphabet soup of an unmaintainable mess. 

"Hey Jimmy, what does field XYZ__001 do?" 

"I don't know, ask Billy" 

"But Billy's on holiday in the Algarve"

"Ooops!'