@kaanyy Your current code in git does not compile, this line is
skeletonAnimation.LateUpdate();
but should be
skeletonAnimation.Renderer.LateUpdate();
kaanyy There's also an alternative approach (marked as Try-2 in the comments).
// Try-2 skeletonAnimation.Update(frames * frameDeltaTime + timeOffset);
Your code next to Try-2 makes little sense, as you increase the playback time by delta + offset each frame. Note that skeletonAnimation.Update() does not set absolute time, it increments the track time at each TrackEntry (animation) by the delta time passed as argument (calling AnimationState.update()). Note that frames in your code (the copied example code) is the number of full-frame increments in this Update call, not the total number of frames.
Having performed a local test, it seems that a potential problem is Unity calling Update() twice at the same identical Time.time and with identical Time.deltaTime, which will obviously lead to incorrect playback with the current code, advancing time twice as much as it should. I have attached an updated version of your script (also renamed the component name to fit the filename).
Note that it all depends on what the target actual framerate on your device is. If it's perfect 60fps all the time, it will be good, if it's e.g. approximately 90 fps, you will inevitably get double-frames when image-swapping at every 1/60s. If you still run into problems, you could steadily advance the time by 1 / 60f seconds each time by calling just skeletonAnimation.Update(1f / 60f); regardless of the actual passed Time.deltaTime. This will then cause other issues of course (playing faster on 90fps devices than on 60fps devices, or when your device FPS are not constant), but these issues might not matter in your context as much and it might be the best solution for you.