I would personally use a finite state machine to represent the user interface. I have shown examples of the structures I'd use
here, noting that I tend to conserve RAM use by putting such structures in ROM/Flash.
I've looked at EastRising/BuyDisplay 1.28" round TFT modules with 240×240-pixel IPS panels; they're 36mm in diameter physically, with a 32.4mm diameter round display area (188 pixels per inch). The GC9A01 driver chip is controlled using 4-wire SPI (data, clock, chip select, and data/command select), much like ILI9341 etc. While you'll need to write your own "driver" for it, it is very similar to existing drivers. Example code is provided only for 8051-based microcontrollers, but it should not be too difficult to adopt to ones own needs.
Assuming you have sufficient amounts of ROM/Flash, you don't actually need a "GUI library" per se, just a flexible
blitter. All your letters and digits are just rectangular (packed) pixel maps, with an alpha channel (for maximum image quality); or with a
palette (indexed color) where each color also includes opacity/alpha.
When the display is updated, you construct a block of pixels (typically one or more rows), initialize it with the correct part of the dial image, then render or blit the relevant parts of visible digits and overlays on top, in visibility order. Unfortunately, I am not aware of any existing MCU graphics library that was optimized for this; however, I haven't looked too hard, since I happen to enjoy that sort of programming myself.
In practice, instead of maintaining an "image" of the display, you maintain data structures (lists or arrays) that describe what is drawn where. (For text, you might use a different set of structures, with a reference to the pixmap set (font) to be used, and construct the pixmap at rendering/blitting time. For analog clock hands, you might use polygons, and so on.) Whenever these structures are changed, the display needs updating. If the structures also contain their bounding box in pixels, the regions that need updating are the union of added and removed bounding boxes.
Since the display is the key to the project, I would definitely start by implementing the display standalone, with whatever microcontroller I prefer. Or heck, even write a trivial simulator in C, and experiment with it. The point is, start drawing actual pictures of what you'd actually want to see on that small display. When you know what and how to display the stuff, you can think about the overall structure of the code.