El problema es que estás usando un while dentro de un for para recorrer el archivo y la lista, el for recorre la lista y el while el archivo, pero tienes que recorrer los dos a la vez no por separado, porque cuando entras al for i es igual a 0 entonces entras al while ( i sigue siendo 0 ) y recorres todo el archivo guardando los datos leídos en m[i][0], m[i][1] y m[i][2] pero como ya dije i es 0, cuando has terminado de leer el archivo sales del while, regresas al for y aumentas i en 1 y vuelves a leer el archivo, pero como ya se ha leído antes el archivo éste ya está en el final así que la instrucción fgets(linea,100,dato) siempre retorna NULL para todo i mayor que 0.
La explicación me ha quedado algo enredada, por lo que te pongo el código con las correcciones:
Código:
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main (){
FILE *dato;
dato=fopen("archi","r");
char linea[100];
float m[100][3];
int i;
for (i=0;i<=100;i++){
// El while no es correcto en este caso
// while(fgets(linea,100,dato)!=NULL)
// {
// Cambio el while por un if para detener el for cuando llegue al final del archivo
if(fgets(linea,100,dato)==NULL) break;
// Cambio el fscanf por sscanf como dijo aloqui
sscanf(linea,"%f %f %f",&m[i][0],&m[i][1],&m[i][2]);
// Había un %f de más
printf("%f %f %f\n",m[i][0],m[i][1],m[i][2]); //cuando imprimo esto todo sale bien
// }
}
// si hago esto me aparece 0.000
// printf("%f \n",m[10][1]);
fclose(dato);
}