Es un problema de la lógica del código. Primero te has de plantear en pseudocódigo como solucionarlo y luego pasarlo a c#.
Para que te hagas una idea, este sería el pseudocódigo de tu código:
Código PSEUDOCODE:
Ver originalb = nº preguntas
a = nº aleatorio entre 1 y menor que b
POR CADA REGISTRO
SI [(registro id) = a ] Y [(registro preguntada) = falso] ENTONCES
mostrar (registro tema)
FIN_SI
FIN_POR
El problema es que solo generas un "id" y luego te limitas a comprobar si esta preguntada o no. Lo que tendrías que tener es un bucle que mientras no te haya encontrado un id con el registro con preguntada=falso, te genere un nuevo id y vuelva a comprovar.
Es decir, lo mismo que tienes, repetirlo hasta que muestras un tema (un WHILE externo).