MySql date range query not showing all records
The date column in database is varchar.


You should really fix that.  If the string always looks like yyyy-mm-dd, then it will happen to work as a date.  (And my code below will work.)  That is, the string version of a DATE or DATETIME is handled almost identically the same as the proper datatype.  One major difference is:  "2019-08-01" versus "2019-8-1"

Do not hide a column (Date) inside a function call (str_to_date)

WHERE str_to_date(b.Date,'%Y-%m-%d') &gt;= str_to_date(concat(YEAR(CURDATE()),'-08-01'),'%Y-%m-%d')-INTERVAL 1 YEAR 
  AND str_to_date(b.Date,'%Y-%m-%d') &lt;= str_to_date(CONCAT(YEAR(CURDATE()),'-08-01'),'%Y-%m-%d')


-->

WHERE b.Date &gt;= CURDATE() - INTERVAL 1 YEAR
  AND b.Date  &lt; CURDATE() + INTERVAL 1 DAY


Did you really want 365 days, plus today?  This disagrees with your statement of "from march 2018 to march 2019".  (Plus March is 03, not 08.)

Now, INDEX(Date) may help with the speed of the query.  I say only "may" because the index will be ignored if the year is most of the table; it would be faster to ignore the table and simply scan the data.  (And my version will be as slow as yours).

Please rearrange your query to use LEFT JOIN instead of RIGHT JOIN.  My brain has trouble with RIGHT JOIN.