I haven't seen this personally, but I had some thoughts:
SDL_GetTicks, which the entire with-events/fps code is based on, returns time at a millisecond granularity. So if you need to do anything more precise than that, you'll need a high(er) resolution timer. But that wouldn't explain the off-by-10s-of-ms issue, except...
SDL_Delay (used in the default FPS manager in Lispbuilder) depends on the OS schedule to wake, which is on many systems works at quanta of about 10ms, and is frequently off by about that much. So that would explain why a normal time loop doesn't do what you want, but not when you use the unlocked framerate...
So I went back and read the code for fps-unlocked in lispbuilder-sdl/sdl/fps.lisp, and then the article that the code links to. And I wonder if that code is really doing what you want, because the goal of that algorithm is to run your physics timestep the correct number of times per graphics timestep, but *not* necessarily to run the physics timestep at regular intervals. So if your graphics timestep takes on the order of 10ms, and the physics takes more like 1ms, then even though most of the time physics will run every ms, there will *still* be 10ms gaps in the timeline when everything is stalled to do graphics. And of course if physics is similarly slow then you run into the same problem in the other direction.
How long do your graphics and physics take? :-)
If the either take ~10ms, then that's probably your issue. In which case you have two options: make them faster, or resort to some sort of multithreading. (Hint: thread is not much fun, so you should probably avoid it if you can.)
If they're both fast, then I'm out of ideas. I guess you just go back to normal performance debugging at that point (which is to say, put timers absolutely everywhere and see where the time is going).