In my opinion there are 2 issues with your approach:
1- All subscription must be inside your Container component, not in your page component. The container is in charge of re-runnig every time some reactive variable changes inside it (for instance, a session variable, a reactive dictionary, subscriptions, etc.). I haven’t checked the implementation of createContainer but I guess it’s a wrapper around Tracker.autorun…
2- You are using ‘this.state’ rather than some reactive variable(s) to hold the client state; you can do it that way but for that you’ll need to follow the approach proposed by @janikvonrotz, ie, your page should be a parent component of your container so that you can pass state down (as props) from your page component to container component. Going back to the approach you are trying to follow, we are exactly in the opposite situation: your container is a parent component of our page so you won’t be able to pass ‘this.state’ to the container. In other to accomplish that, we’ll need to use some GLOBAL variables such as session variables, reactive dictionary or the store provided by Redux. In the example below I’ll consider the simplest approach using reactive variables. Now, notice that this is an anti-patern but I think it’s the simplest way to understand the flow 
// Using session vars is an anti-patern! Once you get the idea try to replace reactive variables with a reactive dictionary or redux
// These are GLOBAL variables so we can set and access them wherever we want to!
Session.set('language', 'javascript');
Session.set('sortBy', { 'stats.completed.total': -1 });
Session.set('tag', defaultTags);
Session.set('limit', 5);
class Explore extends Component {
constructor () {
super()
/* this.state = {
language: 'javascript',
sortBy: { 'stats.completed.total': -1 },
tag: defaultTags,
limit: 5
} */
this.handleLimitChange = this.handleLimitChange.bind(this);
// add more methods for handling the rest of the variables
}
handleLimitChange (e) {
// Previous value for limit
const { limit } = this.props;
// 2- By doing this, we'll force the container to re-run
Session.set('limit', limit + 5);
}
/* handleUpdateFilter (e) {
e.preventDefault()
const { language, tag, sortBy, limit } = this.state
Meteor.subscribe('challenges.explore', language, tag, sortBy, limit)
} */
render () {
// 6- we'll get the new values for language, tag, ... here to be used in you view component
const { language, sortBy, tag, limit } = this.props;
return (
// Use variable in your component here
// Call this.handleLimitChange inside your view to trigger variable change
// 1- By clicking the button we'll call handleLimitChange method
<button onClick={this.handleLimitChange}>
LOAD MORE
</button>
);
}
const ExploreContainer = createContainer(() => {
// 3- Every time any of these variables changes, it will force the container to re-run
const language = Session.get('language');
const sortBy = Session.get('sortBy');
const tag = Session.get('tag');
const limit = Session.get('limit');
// 4- By injecting the new values, we'll force the subscription to rerun
const subscriptions = {
challenges: Meteor.subscribe('challenges.explore', language, defaultTags, tag, limit),
currentUserPlaylists: Meteor.subscribe('playlists.user')
}
return {
// 5- Re-inject values as props for the page component
language,
sortBy,
tag,
limit,
challenges: ChallengesCollection.find().fetch(),
currentUser: Meteor.user(),
currentUserPlaylists: PlaylistsCollection.find().fetch(),
isReady: subscriptions.challenges.ready()
}
}, Explore)
export default ExploreContainer;