EDIT:
After thinking about it somemore, an easy O(n) time algorithm is possible, without the need for RMQ or tree (see previous portion of my answer below).
Given an array A[1...n] and and a window width W, you need to find minimum A[i, ...i+W], given i.
For this, you do the following.
Split A[1...n] into contiguous blocks of size W-1. B1, B2, ...B(W-1).
For each block B, maintain two more block called BStart and BEnd.
BStart[i] = minimum of B1, B[2], ..., B[i].
BEnd[i] = minimum of B[W-1], B[W-2], ..., B[W-i].
This can be done in O(W) time for each block, and so O(n) time total.
Now given an i, the sub-array A[i...i+W] will span two consecutive blocks, say B1 and B2.
Find the minimum from i to end of block B1, and start of block B2 to i+w using B1End and B2Start respectively.
This is O(1) time, so total O(n).
For a circular array C[1....n], all you need to do is run the above on
A[1....2n], which is basically two copies of C concatenated together i.e. A[1...n] = C[1...n] and A[n+1 ... 2n] = C[1...n]
Previous writeup.
Ok. Assuming that I have understood your question correctly this time...
It is possible in O(n) time and O(n) space.
In fact it is possible to change your window size to any number you like, have it different for different elements and still have it work!
Given an array A[1...n], it can be preprocessed in O(n) time and O(n) space to answer queries of the form: What is the position of a minimum element in the sub-array A[i...j]?
in constant time!
This is called the Range Minimum Query Problem.
So theoretically, it is possible to do in O(n) time.
Just using a tree will give you O(nlogW) time, where W is the size of the window and will probably work much better than RMQ, in practice, as I expect the hidden constants might make the RMQ worse.
You can use a tree as follows.
Start backwards and insert W elements. Find the minimum and push onto a stack.
Now delete the first element and insert (W+1)th element. Find the minimum, push on the stack.
Continue this way. Total processing time will be O(nlogW).
At the end you have a stack of minimums, which you can just keep popping off as you now walk the array a second time, this time in the correct order, searching for 0.95*target.
Also, your question is not really clear, you say it is a circular buffer, but you don't seem to be doing a modulus operation with the length. And as coded up, your algorithm is O(n), not O(n^2) as your window size is a constant.