The strace is interesting.
It would be useful to see it with timestamps on each line, but I think you're right that there is some other process doing the parsing - you can see (I think) nickel apparently handing over the filename and required parser on fd 26, and then waiting to read results back.
Code:
[pid 1216] writev(26, [{"l\1\0\1\32\0\0\0\177\0\0\0\177\0\0\0\1\1o\0\25\0\0\0/org/fre"..., 144}, {"\25\0\0\0com.kobo.adobe.Parser\0", 26}], 2) = 170
[pid 1216] gettimeofday({1434473391, 282060}, NULL) = 0
[pid 1216] poll([{fd=26, events=POLLIN}], 1, 25000) = 1 ([{fd=26, revents=POLLIN}])
[pid 1216] read(26, "l\2\1\1\0\0\0\0N\0\0\0005\0\0\0\6\1s\0\4\0\0\0:1.0\0\0\0\0"..., 2048) = 161
[pid 1216] read(26, 0x302ec648, 2048) = -1 EAGAIN (Resource temporarily unavailable)
[pid 1216] writev(26, [{"l\1\1\1\210\0\0\0\200\0\0\0\177\0\0\0\1\1o\0\25\0\0\0/org/fre"..., 144}, {"\203\0\0\0type='signal',sender='org.fr"..., 136}], 2) = 280
[pid 1216] writev(26, [{"l\1\0\1,\0\0\0\201\0\0\0w\0\0\0\1\1o\0\1\0\0\0/\0\0\0\0\0\0\0"..., 136}, {"'\0\0\0file:///mnt/onboard/NEWBOOKS"..., 44}], 2) = 180
[pid 1216] gettimeofday({1434473391, 287120}, NULL) = 0
[pid 1216] poll([{fd=26, events=POLLIN}], 1, 25000) = 1 ([{fd=26, revents=POLLIN}])
[pid 1216] read(26, "l\2\1\1\0\0\0\0P\0\0\0005\0\0\0\6\1s\0\4\0\0\0:1.0\0\0\0\0"..., 2048) = 72
A little after all this the KoboReader.sqlite database is opened and updated. It seems to use a journal file.
One of the strings starts "free" - I wonder if that is "freedesktop", and I wonder if a Qt mechanism is being used.