Ultimately all meta queries get run through
The following coditional statement runs for any meta queries.
if ( empty( $meta_key ) && empty( $meta_value ) )
There's a ticket here for this which outlines what we should be able to do.
What you can do however is purposely pass your query a
meta_value your posts will never likely have and use the
!= (not equals) comparison, technically that should get you the right posts, eg..
$q->set( 'meta_key', 'my_key' );
$q->set( 'meta_value', 'WPSE_RULES!' );
$q->set( 'meta_compare', '!=' );
$q->set( 'orderby', 'meta_value' );
There's one further thing though, you've got these the wrong way round before..
$q->set( 'order','title' );
$q->set( 'orderby', 'DESC');
order sets the which direction to order the results by, valid values are
desc (upper or lowercase).
orderby sets what to the order the results by, eg. date, title, meta value, etc..
I didn't mention that there's actually a new method for querying posts based on meta now, using the
meta_query parameter, but seeing as that won't avoid the problem i've mentioned above and older meta parameters still(in the end) get converted into a
meta_query anyway, i'll simply offer up a link to some examples.
Hope that all helps.. :)