Multiple match() against() in a MySQL query
First, I think we need to assume that str1 and str2 occur in less than half the rows.

I think you will need to CREATE TEMPORARY TABLEs, one with list of id from one MATCH, one from the other.  Create an index on id. 
 Then JOIN the two tables.

It's messy, but FT wants to go first, yet you have two FT clauses in a single query.  Hence my attempt to turn it into two queries.

Since you are using 5.7, and it has the smarts to create an index on a derived table:

SELECT t3.*
    FROM ( SELECT id FROM tbl1 WHERE MATCH ... +str1 ... ) AS t1
    JOIN ( SELECT id FROM tbl1 WHERE MATCH ... -str2 ... ) AS t2  USING(id)
    JOIN tbl1 AS t3  ON  USING(id);


Give it a try. -- I am guessing.