Cant get rid of filesort in simple query
You can try to add an index on time_changed:

alter table texts add index (time_changed);


this could get rid of Using temporary and filesort. But you need to define indexes for your query because the query plan show Using where instead of more healthy Using index.



Updated

Maybe the main culprit for the temporary/filesort is the order of the join. It is not good practice to force the optimizer without a good reason, but you could try to force the join order to test if the temporary/filesort goes away. I have swapped the tables and added a straight_join clause:

SELECT straight_join
     t2.text_id
FROM
    texts AS t2,
    texts_to_categories AS t1
WHERE
    t1.category_id = 123 
    AND t2.text_id = t1.text_id
ORDER BY
    t2.time_changed DESC
LIMIT 10;


Let me know what is the query plan of the previous query.

I don't think that temporary/filesort is a big deal for few hundred rows. I would let the optimizer do its job. I would be more worried to get a better tables schema. If it is feasible for you, I suggest the following changes to your schema.

For texts_categories your table permits NULL value for text_id and for category_id. So I would delete NULL values:

delete from texts_to_categories  where category_id is NULL or text_id is NULL;

alter table texts_to_categories
change category_id category_id int unsigned not null,
change text_id text_id int unsigned not null;


Next if you don't need texts_categories.id column, I would get rid of it, and I would reorganize indexes:

alter table texts_to_categories
drop column id,
add primary key category_text (category_id, text_id),
drop index text_id,
drop index category_id,
add index text_id;


For table texts I will try time_changed column to do not permit null values:

update texts_bck 
set time_changed = '2010-01-01' -- some default
where time_changed is NULL;


alter table texts
change column time_changed time_changed datetime not null 
default current_timestamp;


I hope this is of help.