I'm assuming this is your monthly users plugin? So the userscores table is the same as the one from here.
You don't have an index on the points field in userscores, so in your subquery where you do "points > 100" may be slow (especially if you have many rows in there). Also the table doesn't have a primary key. You'd probably want to make a primary key on "(date, userid)" since that combination should be unique I think.
I'm not sure about your JOIN condition either. You have the same userid in the userscores table multiple times right? One for each month. So that will be taking every row from the userpoints table (many thousands) and combining each one with many rows from the userscores table, making possibly millions of rows in the joined table before filtering.
You are also sorting the query based on a calculated field (mpoints) which cannot be indexed. Coupled with the previous point, if you're trying to sort millions of unindexed rows it will be very slow.
I'm not sure exactly why you are doing that calculation. It seems like you are selecting the user points for January 2017 only, then taking those off the user's total points. I don't see what that is achieving. Don't you want to add up all the user points in a particular year instead? For example this would give you all the years and userids with their total points in those years:
SELECT YEAR(date) AS theyear, userid, SUM(points) AS yearpoints FROM qa_userscores GROUP BY theyear, userid
You could filter by year by doing something like "WHERE date >= '2016-01-01' AND date < '2017-01-01'" for 2016.