Yes, you can achieve your goal with the GNU GPL, except for prohibiting commercial use. Section 7 of the GNU GPL states that you may add "additional terms" as long as they do not restrict the rights granted by the GNU GPL.
In your case, you want to grant an additional exception from the conditions in the GNU GPL or at least clarify your point of view. So instead of just saying
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or (at
your option) any later version.
you would add something like this right after this statement:
As a further permission, you may use this program in a plugin for a
program covered by an incompatible license as long as the plugin
itself is released as free software covered by one of the free
software licenses listed here
http://www.gnu.org/licenses/license-list.html.
It is best to differentiate the software you want to allow combinations with by license instead of referring to it directly as free. That way, you have a specific list of licenses that you want to allow which makes it easier for anyone receiving your software and also is clearer in a legal sense because you do not need a possibly lengthy definition of free vs. non-free. As an alternative, you could say something along the lines of
as long as the plugin itself is released as free software as defined
by the Free Software Foundation.
But I think this may be tricky legally.
If you use the exception the way I described it, someone could use your code in a program covered by the Apache License 2.0. This combined work could not be made non-free because only your exception to the conditions of the GNU GPL allow your code to be used in a combined work covered by a more permissive license. If you do not want to allow use in any free program, you need to restrict the list of allowed licenses. For example, you could say
As a further permission, you may use this program in a plugin for a
program covered by an incompatible license as long as the plugin
itself is covered by a compatible license.
If you want to disallow distribution of the plugin together with a non-free host application, you need to add another statement:
This additional permission does not apply to distributing this program
together with a program covered by an incompatible license.
However, this last statement may be not enforceable depending on how the distribution works. If the plugin and the host program are in the same package, but the user has to load it into the host application, your exception may still apply.
Any of the additional permissions may be removed by anyone distributing your software, though (also section 7 of the GNU GPL). In that case, the program could only be used under the pure GNU GPL.
There is no way to restrict commercial use with any Free Software license. Commercial use is part of the four freedoms, so as soon as you prohibit commercial use, your software becomes non-free. Furthermore, the GNU GPL does not allow such further restrictions; those further restrictions are considered void.
The FSF also has a FAQ entry about when exactly using a plugin constitutes a combined work.
By the way, these statements also apply to the GNU AGPL which may be a good pick if you think your software may be run as a service over a network.