Like athletes, there needs to be some time allocated to training yourself to perform faster, better. Time needs to be allocated to resting too, so it might not be optimal to learn more on weekends and nights.
Good training usually involves something tough, that strains you to your limit. A big part of it is scheduling that training properly so that you can keep improving, and yet aren't too exhausted to get work done.
How do you keep improving yourself? Learning new languages & libraries, shortcuts, better tools, etc?
Work on algorithm problems during slow times at work, or when I know I'll be interviewing soon. I'd just search google for tech interview questions, then implement so that I really understood the solution.
I used to write 2d games as a hobby, I made Tetris, the most ambitious game I completed was a jump n run with a simple level. This taught me 2d graphics, animation, simple physics, and managing state of a lot of interacting entities.
I implemented software 3d with flat shaded polygons and used that to make a demake of an old game. This taught a lot about 3D, matrix math and modeling.
I've implemented parsers and interpreters for simple languages multiple times. I personally think this is the most bang for the buck type of project, you learn a lot about working with text, recursion and tree data structures.
I wrote an emulator for an old architecture. This taught me a lot about assembler and how machines operate.
I wrote a couple of simple games for gameboy color and ran them on an emulator using homebrew tools. This taught me a lot about assembler programming an old game consoles.
I wrote client server library kind of like zeromq. This taught me a lot about socket programming and threads.
There was other stuff. Note all these projects were for my own edification and amusement and were never released anywhere. It was all basically an excercise in "ok that's how that all work", then moved on. There was never a goal or schedule. These were just things that interested me.