UPDATE: I found a solution. See my Answer below.
How can I optimize this query to minimize my downtime? I need to update over
This will let you have read-only access for duration of changes:
create table_new (new schema);
insert into table_new select * from table order by primary_key_column;
rename table to table_old;
rename table_new to table;
-- recreate triggers if necessary
When inserting data to InnoDB tables it's crucial that you do this in primary key's order (otherwise with large datasets it's few orders of magnitude slower).