En Windows:
tl; dr: Intente abrir el archivo nuevamente.
Nuestro sistema sufría este problema, y definitivamente no era un problema de permisos, ya que el programa en sí podría abrir la base de datos como escribible desde muchos subprocesos la mayor parte del tiempo, pero ocasionalmente (solo en Windows, no en OSX), un hilo obtendría estos errores aunque todos los demás hilos del programa no tuvieran dificultades.
Finalmente descubrimos que los subprocesos que fallaban eran solo aquellos que intentaban abrir la base de datos inmediatamente después de que otro subproceso la había cerrado (en 3 ms). Especulamos que el problema se debía al hecho de que Windows (o la implementación de sqlite en Windows) no siempre limpia de inmediato los recursos del archivo al cerrar un archivo. Lo solucionamos ejecutando una consulta de escritura de prueba contra la base de datos al abrir (por ejemplo, crear y luego soltar una tabla con un nombre tonto). Si la creación / eliminación falló, esperamos 50 ms y lo intentamos nuevamente, repitiendo hasta que lo logramos o transcurrieron 5 segundos.
Funcionó; aparentemente, solo necesitaba tiempo suficiente para que los recursos se descargaran en el disco.