To answer you question "is it because X is a mixture of a continous and discrete Random Variable": the answer is no. The mean reasons are (1) the sample size (which is limited / countable) (2) the fact that you're trying to get the tail value and (3) the shape of the KDE (distribution).The theoretical value of 3.088 will be emprirically calculated if and only if you have sufficiently large sample size.
(@Jack JackGuRae says It is about simulations are not actually random which isn't exactly true, as the pseudo-random number generators use algorithms that do ensure that big enough samples are properly distributed, i.e. simulating 1000 dice rolls will give you p=1/6 for each side to let's say 3 d.p.)
(@msitt is spot on with the tail remark)
As you've mentioned before, it is true that for some of the simulations, you needed considerably smaller sample size, but in this case you are trying to sample from a highly left-skewed distribution. Consider following code to plot the KDE:
sims <- 10e6
errors <- rnorm(sims)
v <- ifelse(runif(sims) <= 0.009, -10.0, 0.00)
x <- v + errors
plot(density(x), col = 2, lwd = 2)
abline(v=unname(quantile(x,probs=c(0.01))))

where the vertical line is the 1% quantile. Chances of having a small sample with this particular value for 1% quantile are very small indeed.
Further example where we parametrize the quantile calculation based on the number if simulations and the Bernoulli mode and plot the quantiles based on the number of sims:
set.seed (3134)
quant <- function(sims, tailmode)
{
errors <- rnorm(sims)
v <- ifelse(runif(sims) <= 0.009, tailmode, 0.00)
x <- v + errors
return(unname(quantile(x,probs=c(0.01))))
}
sims <- seq(100, 20000, len=20)
par(mfrow=c(2,2))
plot(sims, Vectorize(quant, c("sims","tailmode"))(sims,-10), col = 2, pch=16, ylim = c(-9, -1), ylab = "", xlab="", main="-10")
plot(sims, Vectorize(quant, c("sims","tailmode"))(sims,-5 ), col = 2, pch=16, ylim = c(-9, -1), ylab = "", xlab="", main="-5")
plot(sims, Vectorize(quant, c("sims","tailmode"))(sims,-1 ), col = 2, pch=16, ylim = c(-9, -1), ylab = "", xlab="", main="-1")
plot(sims, Vectorize(quant, c("sims","tailmode"))(sims, 0 ), col = 2, pch=16, ylim = c(-9, -1), ylab = "", xlab="", main="0")
gives

which clearly shows that the less skewed your distribution is (i.e. the Bernoulli mode increasing), the faster the calculated 1% quantile converges to its model value.